@bitcobblers/wod-wiki-storage 0.35.2117 → 0.35.2119
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/dist/{chunk-Y576CUFQ.mjs → chunk-7ZCBM5NS.mjs} +3 -3
- package/dist/chunk-7ZCBM5NS.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/sql/index.cjs +318 -7
- package/dist/sql/index.cjs.map +1 -1
- package/dist/sql/index.d.cts +158 -3
- package/dist/sql/index.d.ts +158 -3
- package/dist/sql/index.mjs +310 -9
- package/dist/sql/index.mjs.map +1 -1
- package/dist/{wire-Cfvz-I0h.d.cts → wire-CiFcjo6_.d.cts} +1 -1
- package/dist/{wire-Cfvz-I0h.d.ts → wire-CiFcjo6_.d.ts} +1 -1
- package/package.json +6 -6
- package/dist/chunk-Y576CUFQ.mjs.map +0 -1
package/dist/sql/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sql/connection.ts","../../src/sql/codec.ts","../../src/sql/store.ts","../../src/sql/domain.ts","../../src/sql/storage.ts"],"names":["text","clauses","order","rows","params","pageSql"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Connection contracts + a generic libsql adapter. The adapter takes a\n * *structural* client so the browser passes @libsql/client/web and the server\n * passes @libsql/client (node) — this module never imports either, keeping\n * the browser graph free of native drivers.\n *\n * All operations are serialized through one promise chain: the underlying\n * client shares a single connection, so concurrent transactions/reads could\n * otherwise interleave on it. Transactions run on a transaction-owned\n * connection (libsql interactive transaction), so writes inside a transaction\n * commit or roll back atomically and are not visible outside it.\n */\n\nimport type { Client } from '@libsql/client';\n\nimport { StorageError } from './errors';\nexport type SqlValue = string | number | null; // booleans bound as 1/0 by callers\nexport type SqlRow = Record<string, unknown>;\n\nexport interface SqlStatement { sql: string; params?: SqlValue[] }\nexport interface SqlConnection {\n query(sql: string, params?: SqlValue[]): Promise<SqlRow[]>;\n exec(sql: string, params?: SqlValue[]): Promise<void>;\n batch?(statements: SqlStatement[]): Promise<SqlRow[][]>;\n}\n\nexport interface Database extends SqlConnection {\n readonly dialect: 'sqlite' | 'postgres';\n transaction<T>(fn: (tx: SqlConnection) => Promise<T>): Promise<T>;\n close(): Promise<void>;\n}\n\n/** Minimal surface used from a libsql client (node or web build) — the real\n * @libsql/client types, type-only so the browser graph stays driver-free. */\nexport type LibsqlClient = Pick<Client, 'execute' | 'transaction' | 'close'>;\n\nfunction libsqlRows(result: { rows: ArrayLike<Record<string, unknown>> }): SqlRow[] {\n return result.rows as unknown as SqlRow[];\n}\n\n/** Wrap a libsql client (node or web build) into the shared Database surface. */\nexport function libsqlDatabase(client: LibsqlClient): Database {\n let chain: Promise<unknown> = Promise.resolve();\n const serialize = <T>(fn: () => Promise<T>): Promise<T> => {\n const next = chain.then(fn, fn);\n chain = next.then(() => undefined, () => undefined);\n return next;\n };\n return {\n dialect: 'sqlite',\n query: (sql, params = []) => serialize(() => client.execute({ sql, args: params }).then(libsqlRows)),\n exec: async (sql, params = []) => {\n await serialize(() => client.execute({ sql, args: params }));\n },\n transaction<T>(fn: (tx: SqlConnection) => Promise<T>): Promise<T> {\n return serialize(async () => {\n const tx = await client.transaction('write');\n try {\n const txConn: SqlConnection = {\n query: (sql, params = []) => tx.execute({ sql, args: params }).then(libsqlRows),\n exec: async (sql, params = []) => {\n await tx.execute({ sql, args: params });\n },\n batch: async (statements) => (await tx.batch(statements.map(({ sql, params = [] }) => ({ sql, args: params })))).map(libsqlRows),\n };\n const result = await fn(txConn);\n await tx.commit();\n return result;\n } catch (err) {\n try {\n await tx.rollback();\n } catch {\n // transaction already closed by the failed statement\n }\n const message = err instanceof Error ? err.message : String(err);\n for (const code of ['revision_conflict', 'transaction_conflict', 'invalid_session_pin']) {\n if (message.includes(code)) throw new StorageError(409, message, code);\n }\n throw err;\n } finally {\n tx.close();\n }\n });\n },\n close: async () => {\n await chain;\n client.close();\n },\n };\n}\n","/**\n * Row codec for the SQL `data` column. Plain JSON.stringify destroys\n * ArrayBuffer values ({}); attachment rows carry raw blobs, so encoding tags\n * the declared binary field and decoding revives it.\n *\n * Collision safety: tagging applies ONLY to the declared binary field of the\n * declared store (attachments.data) — arbitrary rows (meta, notes, …) are\n * plain JSON in both directions, so authored {$binary:…}-shaped objects\n * anywhere else round-trip byte-for-byte. Within attachments.data the value\n * is typed `ArrayBuffer | string`; strings pass through, and only the exact\n * two-key tag revives.\n */\n\nconst TAG = '$binary';\nconst LEN = '$bytes';\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n const CHUNK = 0x8000; // String.fromCharCode.apply arg ceiling\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length); // exact-length buffer: .buffer IS the decoded ArrayBuffer\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Tag shape: exactly { $binary: base64, $bytes: length }. */\nfunction reviveBinary(value: unknown): unknown {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(TAG) || !keys.includes(LEN)) return value;\n const tag = value as Record<string, unknown>;\n if (typeof tag[TAG] !== 'string' || typeof tag[LEN] !== 'number') return value;\n const bytes = base64ToBytes(tag[TAG]);\n if (bytes.length !== tag[LEN]) {\n throw new Error(`corrupt binary cell: declared ${tag[LEN]} bytes, decoded ${bytes.length}`);\n }\n return bytes.buffer;\n}\n\n/** Serialize a row; when `binaryField` is set and holds an ArrayBuffer, it is\n * replaced by the lossless tag (shallow copy — the input row is untouched). */\nconst canonicalJson = (_key: string, value: unknown): unknown => {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n return Object.fromEntries(Object.keys(value).sort().map(key => [key, Reflect.get(value, key)]));\n};\nexport function encodeRowJson(value: unknown, binaryField?: string): string {\n if (binaryField && value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const row = value as Record<string, unknown>;\n const data = row[binaryField];\n if (data instanceof ArrayBuffer) {\n const bytes = new Uint8Array(data);\n return JSON.stringify({ ...row, [binaryField]: { [TAG]: bytesToBase64(bytes), [LEN]: bytes.length } }, canonicalJson);\n }\n }\n return JSON.stringify(value, canonicalJson);\n}\n\n/** Parse a row; when `binaryField` is set, a tagged value there revives as an\n * ArrayBuffer. Every other value — including tag-shaped data in other fields\n * or stores — is returned exactly as authored. */\nexport function decodeRowJson<T = unknown>(text: string, binaryField?: string): T {\n const row = JSON.parse(text) as unknown;\n if (binaryField && row !== null && typeof row === 'object' && !Array.isArray(row)) {\n const record = row as Record<string, unknown>;\n const revived = reviveBinary(record[binaryField]);\n if (revived !== record[binaryField]) record[binaryField] = revived;\n }\n return row as T;\n}\n","/**\n * Schema-driven store operations: IDB-style stores persisted into SQL tables\n * (one per store, extracted key/index columns + full JSON in `data`). The\n * schema derives entirely from STORE_DEFS / COLUMN_TYPES; JSON payloads stay\n * the source of truth. Shared by the API server and the browser\n * BrowserTursoStorage/SqlStorage backends.\n */\nimport {\n COLUMN_TYPES,\n DB_VERSION,\n STORE_DEFS,\n type IndexDef,\n type StorageColumnType,\n type StoreDef,\n} from '../schema';\nimport {\n compareKeys,\n extractKeyPart,\n isRange,\n keyInRange,\n type KeyDTO,\n type RangeDTO,\n type Scalar,\n} from '../wire';\nimport type { Database, SqlConnection, SqlRow, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport type { StoreName } from '../contract';\nimport { decodeRowJson, encodeRowJson } from './codec';\nimport { validateStorageRow } from '../validation';\n\nexport const SCHEMA_TABLE = '_wodwiki_schema';\nconst SCHEMA_KEY = 'schema';\n\n/** Stores whose rows carry a raw binary field the codec must preserve. */\nconst BINARY_FIELD: Partial<Record<StoreName, string>> = { attachments: 'data' };\n\nconst binaryFieldOf = (def: StoreDef): string | undefined => BINARY_FIELD[def.name];\n\nexport function storeDefinition(name: string): StoreDef {\n const def = STORE_DEFS.find((d) => d.name === name);\n if (!def) throw new StorageError(404, `unknown store: ${name}`);\n return def;\n}\n\nfunction indexDefinition(def: StoreDef, indexName: string): IndexDef {\n const idx = def.indexes.find((i) => i.name === indexName);\n if (!idx) throw new StorageError(404, `unknown index: ${def.name}.${indexName}`);\n return idx;\n}\n\n/** ASCII identifier chars only; everything else → '_' (safe inside quotes). */\nfunction sanitize(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, '_');\n}\n\nconst indexCol = (indexName: string, part: number): string => `i_${sanitize(indexName)}_${part}`;\n\nfunction keyCols(def: StoreDef): string[] {\n return def.keyPath.map((_, i) => `k${i}`);\n}\n\nconst junctionTable = (def: StoreDef, idx: IndexDef): string => `${def.name}__${sanitize(idx.name)}`;\n\nconst multiEntryIndex = (def: StoreDef): IndexDef | undefined => def.indexes.find((i) => i.multiEntry);\n\nfunction pathType(def: StoreDef, path: string): StorageColumnType {\n return COLUMN_TYPES[def.name][path] ?? 'text';\n}\n\n/** SQLite store columns stay untyped (BLOB affinity) so values keep their\n * storage class and IDB ordering; PostgreSQL needs concrete types. Numbers\n * and booleans bind as float8 (booleans as 0/1), so both get DOUBLE\n * PRECISION. Text uses COLLATE \"C\" so PG ordering matches SQLite bytes. */\nfunction colSql(dialect: 'sqlite' | 'postgres', type: StorageColumnType): string {\n if (dialect === 'sqlite') return '';\n return type === 'text' ? ' TEXT COLLATE \"C\"' : ' DOUBLE PRECISION';\n}\n\n/** Runtime scalar → bound SQL value: null→NULL, bool→1/0, number/string as-is,\n * anything else → JSON text. */\nfunction toSqlScalar(v: unknown): SqlValue {\n if (v === null || v === undefined) return null;\n if (typeof v === 'boolean') return v ? 1 : 0;\n if (typeof v === 'number' || typeof v === 'string') return v;\n return JSON.stringify(v);\n}\n\nfunction validateKey(key: unknown): asserts key is KeyDTO {\n const scalar = (v: unknown): v is Scalar =>\n typeof v === 'string' || (typeof v === 'number' && Number.isFinite(v));\n if (!scalar(key) && !(Array.isArray(key) && key.length > 0 && key.every(scalar))) {\n throw new StorageError(400, 'key must be a string, finite number, or non-empty scalar tuple');\n }\n}\n\nfunction validateRange(range: RangeDTO | undefined): void {\n if (range === undefined) return;\n if (range === null || typeof range !== 'object' || Array.isArray(range)) {\n throw new StorageError(400, 'range must be an object');\n }\n for (const key of [range.only, range.lower, range.upper]) {\n if (key !== undefined) validateKey(key);\n }\n for (const open of [range.lowerOpen, range.upperOpen]) {\n if (open !== undefined && typeof open !== 'boolean') {\n throw new StorageError(400, 'range open flags must be boolean');\n }\n }\n}\n\nfunction toParts(key: KeyDTO): Scalar[] {\n validateKey(key);\n return Array.isArray(key) ? key : [key];\n}\n\n/** Reads a dotted path whose leaf must be an array (multiEntry values).\n * Shared extractKeyPart deliberately rejects array leaves, so the last hop\n * is traversed here over the parsed JSON row. */\nfunction arrayPart(value: unknown, dotted: string): unknown[] | undefined {\n let cur: unknown = value;\n for (const part of dotted.split('.')) {\n if (cur === null || typeof cur !== 'object') return undefined;\n // Traversal over parsed JSON: only plain rows are ever stored.\n const row = cur as Record<string, unknown>;\n cur = row[part];\n }\n return Array.isArray(cur) ? cur : undefined;\n}\n\n/** Primary-key extraction at the trust boundary: a missing keyPath part is\n * required-input validation → 400 (not an internal error). */\nfunction requireKey(def: StoreDef, value: unknown): KeyDTO {\n const parts = def.keyPath.map((p) => extractKeyPart(value, p));\n for (const [i, part] of parts.entries()) {\n if (part === undefined) {\n throw new StorageError(400, `keyPath part '${def.keyPath[i]}' missing on ${def.name} value`);\n }\n }\n const key = parts as Scalar[];\n return key.length === 1 ? key[0] : key;\n}\n\n/** Scalar bounds compile to the first key column; tuple bounds compile\n * part-wise when their arity fits the target columns; anything else returns\n * null → caller falls back to a scan + shared keyInRange filter. Returns the WHERE\n * clause ('' when unfiltered) and pushes bound params in order. */\nfunction rangeWhere(cols: string[], range: RangeDTO | undefined, params: SqlValue[]): string | null {\n if (!range) return '';\n if (range.only !== undefined) {\n const parts = toParts(range.only);\n if (parts.length > cols.length) return null;\n const clauses = parts.map((p, i) => {\n params.push(toSqlScalar(p));\n return `\"${cols[i]}\" = ?`;\n });\n return ` WHERE ${clauses.join(' AND ')}`;\n }\n const bounds: Array<[Scalar[], string]> = [];\n if (range.lower !== undefined && range.lower !== null) {\n bounds.push([toParts(range.lower), range.lowerOpen ? '>' : '>=']);\n }\n if (range.upper !== undefined && range.upper !== null) {\n bounds.push([toParts(range.upper), range.upperOpen ? '<' : '<=']);\n }\n const clauses: string[] = [];\n for (const [parts, op] of bounds) {\n if (parts.length > cols.length) return null;\n if (parts.length === 1) {\n params.push(toSqlScalar(parts[0]));\n clauses.push(`\"${cols[0]}\" ${op} ?`);\n } else {\n // Tuple compare: (c0,c1) >= (p0,p1) ⇔ c0 > p0 OR (c0 = p0 AND c1 >= p1)\n const ors = parts.map((p, i) => {\n const eqs: string[] = [];\n for (let j = 0; j < i; j++) {\n params.push(toSqlScalar(parts[j]));\n eqs.push(`\"${cols[j]}\" = ?`);\n }\n params.push(toSqlScalar(p));\n const cmpOp = i === parts.length - 1 ? op : op[0];\n eqs.push(`\"${cols[i]}\" ${cmpOp} ?`);\n return `(${eqs.join(' AND ')})`;\n });\n clauses.push(`(${ors.join(' OR ')})`);\n }\n }\n return clauses.length ? ` WHERE ${clauses.join(' AND ')}` : '';\n}\n\nfunction clampLimit(count: number | undefined): number | undefined {\n if (count === undefined) return undefined;\n if (typeof count !== 'number' || !Number.isFinite(count)) {\n throw new StorageError(400, `invalid count: ${String(count)}`);\n }\n return Math.max(0, Math.floor(count));\n}\n\nconst limitClause = (count: number | undefined): string =>\n count === undefined ? '' : ` LIMIT ${clampLimit(count)}`;\n\nfunction parseRows(rows: SqlRow[], binaryField?: string): unknown[] {\n return rows.map((r) => decodeRowJson(r.data as string, binaryField));\n}\n\n/** Full-table scan + in-memory IDB filtering/ordering via the shared wire\n * helpers. Only reachable for range shapes the column compile cannot express\n * (arity mismatches). Rows missing an index field are NOT in the index\n * (IDB semantics) and are skipped; a missing primary key is a 400. */\nasync function scanRows(\n conn: SqlConnection,\n def: StoreDef,\n idx: IndexDef | undefined,\n range: RangeDTO | undefined,\n limit: number | undefined,\n): Promise<unknown[]> {\n const rows = await conn.query(`SELECT \"data\" FROM \"${def.name}\"`);\n const keyed: Array<[KeyDTO, unknown]> = [];\n for (const row of rows) {\n const value = decodeRowJson(row.data as string, binaryFieldOf(def));\n if (idx) {\n const parts = idx.keyPath.map((p) => extractKeyPart(value, p));\n if (!parts.every((p): p is Scalar => p !== undefined)) continue;\n const key = parts.length === 1 ? parts[0] : parts;\n if (range && !keyInRange(key, range)) continue;\n keyed.push([key, value]);\n } else {\n const key = requireKey(def, value);\n if (range && !keyInRange(key, range)) continue;\n keyed.push([key, value]);\n }\n }\n keyed.sort((a, b) => compareKeys(a[0], b[0]));\n const out = keyed.map(([, v]) => v);\n return limit === undefined ? out : out.slice(0, limit);\n}\n\nexport async function getRow(conn: SqlConnection, def: StoreDef, key: KeyDTO): Promise<unknown | undefined> {\n const parts = toParts(key);\n if (parts.length !== def.keyPath.length) {\n throw new StorageError(400, `key arity ${parts.length} != keyPath arity ${def.keyPath.length} for ${def.name}`);\n }\n const cond = keyCols(def).map((c) => `\"${c}\" = ?`).join(' AND ');\n const rows = await conn.query(\n `SELECT \"data\" FROM \"${def.name}\" WHERE ${cond}`,\n parts.map(toSqlScalar),\n );\n return rows[0] ? decodeRowJson(rows[0].data as string, binaryFieldOf(def)) : undefined;\n}\n\nexport async function getRows(conn: SqlConnection, def: StoreDef, keys: KeyDTO[]): Promise<(unknown | undefined)[]> {\n const found = new Map<string, unknown>();\n for (const part of chunks(keys, 500)) {\n const params: SqlValue[] = [];\n const conditions = part.map(key => {\n const parts = toParts(key);\n if (parts.length !== def.keyPath.length) throw new StorageError(400, 'invalid compound key arity');\n params.push(...parts.map(toSqlScalar));\n return `(${keyCols(def).map(col => `\"${col}\" = ?`).join(' AND ')})`;\n });\n for (const row of await conn.query(`SELECT \"data\" FROM \"${def.name}\" WHERE ${conditions.join(' OR ')}`, params)) {\n const value = decodeRowJson(String(row.data), binaryFieldOf(def));\n found.set(JSON.stringify(requireKey(def, value)), value);\n }\n }\n return keys.map(key => found.get(JSON.stringify(key)));\n}\n\nexport async function listRowsFromIndexMany(conn: SqlConnection, def: StoreDef, indexName: string, keys: KeyDTO[]): Promise<unknown[][]> {\n const idx = indexDefinition(def, indexName);\n if (idx.multiEntry) {\n const out: unknown[][] = [];\n for (const key of keys) out.push(await listRows(conn, def, { only: key }, undefined, indexName));\n return out;\n }\n const found = new Map<string, unknown[]>();\n for (const part of chunks(keys, 500)) {\n const params: SqlValue[] = [];\n const conditions = part.map(key => {\n const parts = toParts(key);\n if (parts.length !== idx.keyPath.length) throw new StorageError(400, 'invalid index key arity');\n params.push(...parts.map(toSqlScalar));\n return `(${parts.map((_, i) => `\"${indexCol(idx.name, i)}\" = ?`).join(' AND ')})`;\n });\n for (const row of await conn.query(`SELECT \"data\" FROM \"${def.name}\" WHERE ${conditions.join(' OR ')} ORDER BY ${keyCols(def).map(col => `\"${col}\"`).join(', ')}`, params)) {\n const value = decodeRowJson(String(row.data), binaryFieldOf(def));\n const parts = idx.keyPath.map(path => extractKeyPart(value, path));\n const key = JSON.stringify(parts.length === 1 ? parts[0] : parts);\n const bucket = found.get(key);\n if (bucket) bucket.push(value); else found.set(key, [value]);\n }\n }\n return keys.map(key => found.get(JSON.stringify(key)) ?? []);\n}\n\nexport async function listRows(\n conn: SqlConnection,\n def: StoreDef,\n range?: RangeDTO,\n count?: number,\n indexName?: string,\n): Promise<unknown[]> {\n validateRange(range);\n const idx = indexName ? indexDefinition(def, indexName) : undefined;\n const binaryField = binaryFieldOf(def);\n if (idx?.multiEntry) {\n // JSON encoding preserves numeric/string equality in both SQL dialects.\n const only = range?.only;\n if (only === undefined || typeof only === 'object') {\n throw new StorageError(400, `multi-entry index ${def.name}.${idx.name} supports exact-match queries only`);\n }\n const joinOn = keyCols(def).map((c) => `j.\"${c}\" = e.\"${c}\"`).join(' AND ');\n // IDB multi-entry ordering: junction value first, then the primary key.\n const order = ['j.\"v\"', ...keyCols(def).map((c) => `j.\"${c}\"`)].join(', ');\n const rows = await conn.query(\n `SELECT e.\"data\" AS \"data\" FROM \"${def.name}\" e JOIN \"${junctionTable(def, idx)}\" j ON ${joinOn}` +\n ` WHERE j.\"v\" = ? ORDER BY ${order}${limitClause(count)}`,\n [JSON.stringify(only)],\n );\n return parseRows(rows, binaryField);\n }\n const cols = idx ? idx.keyPath.map((_, part) => indexCol(idx.name, part)) : keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, range, params);\n if (where === null) return scanRows(conn, def, idx, range, clampLimit(count));\n // IDB: rows whose index key is missing/invalid are not in the index —\n // exclude them even from unfiltered listings (SQL NULL comparison alone\n // only drops them from bounded ranges). NULLS never reach ORDER BY.\n const notNull = cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ');\n const cond = where ? `${where} AND ${notNull}` : ` WHERE ${notNull}`;\n // IDB orders index results by (index key, primary key).\n const keyNames = keyCols(def).filter((k) => !cols.includes(k));\n const order = ` ORDER BY ${[...cols, ...keyNames].map((c) => `\"${c}\"`).join(', ')}`;\n const rows = await conn.query(\n `SELECT \"data\" FROM \"${def.name}\"${cond}${order}${limitClause(count)}`,\n params,\n );\n return parseRows(rows, binaryField);\n}\n\nexport async function countRows(\n conn: SqlConnection,\n def: StoreDef,\n range?: RangeDTO,\n indexName?: string,\n): Promise<number> {\n validateRange(range);\n const idx = indexName ? indexDefinition(def, indexName) : undefined;\n if (idx?.multiEntry) {\n const only = range?.only;\n if (only === undefined || typeof only === 'object') {\n throw new StorageError(400, `multi-entry index ${def.name}.${idx.name} supports exact-match queries only`);\n }\n const joinOn = keyCols(def).map((c) => `j.\"${c}\" = e.\"${c}\"`).join(' AND ');\n const rows = await conn.query(\n `SELECT COUNT(*) AS \"n\" FROM \"${def.name}\" e JOIN \"${junctionTable(def, idx)}\" j ON ${joinOn} WHERE j.\"v\" = ?`,\n [JSON.stringify(only)],\n );\n return Number(rows[0]?.n ?? 0);\n }\n const cols = idx ? idx.keyPath.map((_, part) => indexCol(idx.name, part)) : keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, range, params);\n if (where === null) {\n const all = await scanRows(conn, def, idx, range, undefined);\n return all.length;\n }\n const cond = idx ? (where ? `${where} AND ${cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ')}` : ` WHERE ${cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ')}`) : where;\n const rows = await conn.query(`SELECT COUNT(*) AS \"n\" FROM \"${def.name}\"${cond}`, params);\n return Number(rows[0]?.n ?? 0);\n}\n\n/** Bound-parameter budget per statement. SQLite ≥3.32 allows 32766; 20k\n * leaves headroom, and the row cap keeps single request bodies ≤ ~1 MB. */\nconst PARAM_BUDGET = 20000;\nconst ROW_CAP = 100;\n\nconst chunks = <T>(arr: T[], size: number): T[][] => {\n const out: T[][] = [];\n for (let i = 0; i < arr.length; i += size) out.push(arr.slice(i, i + size));\n return out;\n};\n\n/** Multi-row `INSERT … ON CONFLICT` in param-budgeted chunks. One round trip\n * per chunk over Turso instead of one per row. `cols` are internal schema\n * identifiers (never user input); `onConflict` is the full trailing clause. */\nexport async function batchInsert(\n conn: SqlConnection,\n table: string,\n cols: string[],\n rows: SqlValue[][],\n onConflict: string,\n): Promise<void> {\n if (rows.length === 0) return;\n const collist = cols.map((c) => `\"${c}\"`).join(', ');\n const tuple = `(${cols.map(() => '?').join(', ')})`;\n const per = Math.max(1, Math.min(ROW_CAP, Math.floor(PARAM_BUDGET / cols.length)));\n const statements = chunks(rows, per).map(part => ({\n sql: `INSERT INTO \"${table}\" (${collist}) VALUES ${part.map(() => tuple).join(', ')} ${onConflict}`,\n params: part.flat(),\n }));\n if (conn.batch) await conn.batch(statements);\n else for (const statement of statements) await conn.exec(statement.sql, statement.params);\n}\n\n/** Chunked `DELETE … WHERE col IN (…)` — one round trip per chunk. */\nexport async function deleteIn(conn: SqlConnection, table: string, col: string, vals: SqlValue[]): Promise<void> {\n for (const part of chunks(vals, 500)) {\n if (part.length === 0) continue;\n await conn.exec(`DELETE FROM \"${table}\" WHERE \"${col}\" IN (${part.map(() => '?').join(', ')})`, part);\n }\n}\n\nexport async function putRows(conn: SqlConnection, def: StoreDef, values: unknown[], changedKeys?: KeyDTO[]): Promise<KeyDTO[]> {\n if (values.length === 0) return [];\n for (const value of values) validateStorageRow(def.name, value);\n const keys = keyCols(def);\n const cols = [...keys];\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((_, part) => cols.push(indexCol(idx.name, part)));\n }\n cols.push('data');\n const keySet = new Set(keys);\n const updates = cols.filter((c) => !keySet.has(c)).map((c) => `\"${c}\" = excluded.\"${c}\"`).join(', ');\n const pk = keys.map((k) => `\"${k}\"`).join(', ');\n\n const rows: SqlValue[][] = [];\n const out: KeyDTO[] = [];\n const junction: SqlValue[][] = [];\n const multi = multiEntryIndex(def);\n for (const value of values) {\n const k = requireKey(def, value);\n const keyParts = toParts(k).map(toSqlScalar);\n const vals = [...keyParts];\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((path) => vals.push(toSqlScalar(extractKeyPart(value, path) ?? null)));\n }\n vals.push(encodeRowJson(value, binaryFieldOf(def)));\n rows.push(vals);\n out.push(k);\n if (multi) {\n const items = arrayPart(value, multi.keyPath[0]);\n if (Array.isArray(items)) {\n for (const item of items) junction.push([...keyParts, JSON.stringify(item)]);\n }\n }\n }\n const tuple = `(${cols.map(() => '?').join(', ')})`;\n const per = Math.max(1, Math.min(ROW_CAP, Math.floor(PARAM_BUDGET / cols.length)));\n const statements = chunks(rows, per).map(part => ({\n sql: `INSERT INTO \"${def.name}\" (${cols.map(col => `\"${col}\"`).join(', ')}) VALUES ${part.map(() => tuple).join(', ')} `\n + (def.name === 'block_revisions' ? `ON CONFLICT (${pk}) DO NOTHING` : `ON CONFLICT (${pk}) DO UPDATE SET ${updates} WHERE \"${def.name}\".\"data\" <> excluded.\"data\"`)\n + ` RETURNING ${keys.map(col => `\"${col}\"`).join(', ')}`,\n params: part.flat(),\n }));\n let returned: SqlRow[][];\n try {\n if (conn.batch) returned = await conn.batch(statements);\n else {\n returned = [];\n for (const statement of statements) returned.push(await conn.query(statement.sql, statement.params));\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n for (const code of ['revision_conflict', 'transaction_conflict', 'invalid_session_pin']) {\n if (message.includes(code)) throw new StorageError(409, message, code);\n }\n throw error;\n }\n const changed = returned.flat().map(row => {\n const parts = keys.map(col => row[col]) as Scalar[];\n return parts.length === 1 ? parts[0] : parts;\n });\n changedKeys?.push(...changed);\n if (multi) {\n const jt = junctionTable(def, multi);\n const changedSet = new Set(changed.map(key => JSON.stringify(key)));\n const deletes = values.flatMap(value => {\n const key = requireKey(def, value);\n if (!changedSet.has(JSON.stringify(key))) return [];\n const items = arrayPart(value, multi.keyPath[0]) ?? [];\n return [{ sql: `DELETE FROM \"${jt}\" WHERE ${keys.map(col => `\"${col}\" = ?`).join(' AND ')}`\n + (items.length ? ` AND \"v\" NOT IN (${items.map(() => '?').join(', ')})` : ''),\n params: [...toParts(key).map(toSqlScalar), ...items.map(item => JSON.stringify(item))] }];\n });\n if (conn.batch && deletes.length) await conn.batch(deletes);\n else for (const statement of deletes) await conn.exec(statement.sql, statement.params);\n await batchInsert(conn, jt, [...keys, 'v'], junction.filter(row => changedSet.has(JSON.stringify(keys.length === 1 ? row[0] : row.slice(0, keys.length)))), 'ON CONFLICT DO NOTHING');\n }\n return out;\n}\n\nexport async function putRow(conn: SqlConnection, def: StoreDef, value: unknown): Promise<KeyDTO> {\n return (await putRows(conn, def, [value]))[0];\n}\n\nexport async function deleteRows(conn: SqlConnection, def: StoreDef, keyOrRange: KeyDTO | RangeDTO): Promise<void> {\n if (def.name === 'block_revisions') throw new StorageError(409, 'block history may only be removed by explicit wipe', 'revision_conflict');\n const multi = multiEntryIndex(def);\n if (!isRange(keyOrRange)) {\n const parts = toParts(keyOrRange);\n if (parts.length > def.keyPath.length) {\n throw new StorageError(400, `key arity ${parts.length} > keyPath arity ${def.keyPath.length} for ${def.name}`);\n }\n const n = Math.min(parts.length, def.keyPath.length);\n const cond = keyCols(def).slice(0, n).map((c) => `\"${c}\" = ?`).join(' AND ');\n const params = parts.slice(0, n).map(toSqlScalar);\n if (multi) await conn.exec(`DELETE FROM \"${junctionTable(def, multi)}\" WHERE ${cond}`, params);\n await conn.exec(`DELETE FROM \"${def.name}\" WHERE ${cond}`, params);\n return;\n }\n validateRange(keyOrRange);\n const cols = keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, keyOrRange, params);\n if (where === null) {\n // Uncompilable shape: enumerate matching rows, delete per key.\n for (const row of await listRows(conn, def, keyOrRange)) {\n await deleteRows(conn, def, requireKey(def, row));\n }\n return;\n }\n const collist = cols.map((c) => `\"${c}\"`).join(', ');\n if (multi) {\n await conn.exec(\n `DELETE FROM \"${junctionTable(def, multi)}\" WHERE (${collist}) IN (SELECT ${collist} FROM \"${def.name}\"${where})`,\n params,\n );\n }\n await conn.exec(`DELETE FROM \"${def.name}\"${where}`, params);\n}\n\nexport async function clearRows(conn: SqlConnection, def: StoreDef, wipe = false): Promise<void> {\n if (def.name === 'block_revisions' && !wipe) throw new StorageError(409, 'block history may only be removed by explicit wipe', 'revision_conflict');\n const multi = multiEntryIndex(def);\n if (multi) await conn.exec(`DELETE FROM \"${junctionTable(def, multi)}\"`);\n await conn.exec(`DELETE FROM \"${def.name}\"`);\n}\n\n/** Wipe all user stores; system stores (memberships) survive and the internal\n * schema metadata table is not a store, so the version guard is untouched. */\nexport async function wipeRows(conn: SqlConnection): Promise<void> {\n for (const def of STORE_DEFS) {\n if (!def.system) await clearRows(conn, def, true);\n }\n}\n\nfunction tableListSql(dialect: 'sqlite' | 'postgres'): string {\n return dialect === 'sqlite'\n ? `SELECT \"name\" FROM \"sqlite_master\" WHERE \"type\" = 'table'`\n : `SELECT \"table_name\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = current_schema()`;\n}\n\n/** Create the current schema only. Existing incompatible versions fail closed. */\nasync function ensureStoreTables(\n conn: SqlConnection,\n dialect: 'sqlite' | 'postgres',\n def: StoreDef,\n): Promise<void> {\n const keys = keyCols(def);\n const cols: Array<[string, string]> = keys.map((k, i) => [k, colSql(dialect, pathType(def, def.keyPath[i]))]);\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((path, part) => {\n cols.push([indexCol(idx.name, part), colSql(dialect, pathType(def, path))]);\n });\n }\n cols.push(['data', ' TEXT NOT NULL']);\n const colDefs = cols.map(([c, t]) => `\"${c}\"${t}`);\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${def.name}\" (${colDefs.join(', ')}, PRIMARY KEY (${keys.map((k) => `\"${k}\"`).join(', ')}))`,\n );\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n const parts = idx.keyPath.map((_, part) => `\"${indexCol(idx.name, part)}\"`).join(', ');\n await conn.exec(\n `CREATE ${idx.unique ? 'UNIQUE ' : ''}INDEX IF NOT EXISTS \"${def.name}__${sanitize(idx.name)}\" ON \"${def.name}\" (${parts})`,\n );\n }\n const multi = multiEntryIndex(def);\n if (multi) {\n const jt = junctionTable(def, multi);\n const jkeys = keys.map((k, i) => `\"${k}\"${colSql(dialect, pathType(def, def.keyPath[i]))}`);\n // v: BLOB affinity on sqlite (storage class preserved), byte-order C on PG.\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${jt}\" (${jkeys.join(', ')}, \"v\"${colSql(dialect, 'text')}, PRIMARY KEY (${[...keys, '\"v\"'].join(', ')}))`,\n );\n await conn.exec(`CREATE INDEX IF NOT EXISTS \"${jt}__v\" ON \"${jt}\" (\"v\")`);\n }\n if (def.name === 'notes' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"notes_revision_guard\" BEFORE UPDATE ON \"notes\"\n WHEN json_extract(NEW.\"data\", '$.sourceRevision') < json_extract(OLD.\"data\", '$.sourceRevision')\n OR ((json_extract(NEW.\"data\", '$.rawContent') IS NOT json_extract(OLD.\"data\", '$.rawContent')\n OR json_extract(NEW.\"data\", '$.blocks') IS NOT json_extract(OLD.\"data\", '$.blocks'))\n AND json_extract(NEW.\"data\", '$.sourceRevision') <= json_extract(OLD.\"data\", '$.sourceRevision'))\n BEGIN SELECT RAISE(ABORT, 'transaction_conflict: stale Note source revision'); END`);\n }\n if (def.name === 'block_revisions' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"block_revision_guard\" BEFORE INSERT ON \"block_revisions\"\n WHEN EXISTS (SELECT 1 FROM \"block_revisions\" old WHERE old.\"k0\" = NEW.\"k0\" AND old.\"k1\" = NEW.\"k1\" AND old.\"k2\" = NEW.\"k2\" AND old.\"data\" <> NEW.\"data\")\n BEGIN SELECT RAISE(ABORT, 'revision_conflict: immutable block revision collision'); END`);\n }\n if (def.name === 'sessions' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"session_pin_guard\" BEFORE UPDATE ON \"sessions\"\n WHEN json_extract(NEW.\"data\", '$.noteId') IS NOT json_extract(OLD.\"data\", '$.noteId')\n OR json_extract(NEW.\"data\", '$.blockId') IS NOT json_extract(OLD.\"data\", '$.blockId')\n OR json_extract(NEW.\"data\", '$.blockVersion') IS NOT json_extract(OLD.\"data\", '$.blockVersion')\n BEGIN SELECT RAISE(ABORT, 'invalid_session_pin: Session pin is immutable'); END`);\n }\n if (dialect === 'postgres' && ['notes', 'block_revisions', 'sessions'].includes(def.name)) {\n const condition = def.name === 'block_revisions'\n ? `EXISTS (SELECT 1 FROM \"block_revisions\" old WHERE old.\"k0\" = NEW.\"k0\" AND old.\"k1\" = NEW.\"k1\" AND old.\"k2\" = NEW.\"k2\" AND old.\"data\" <> NEW.\"data\")`\n : def.name === 'notes'\n ? `(NEW.\"data\"::jsonb->>'sourceRevision')::bigint < (OLD.\"data\"::jsonb->>'sourceRevision')::bigint OR ((NEW.\"data\"::jsonb->'rawContent' IS DISTINCT FROM OLD.\"data\"::jsonb->'rawContent' OR NEW.\"data\"::jsonb->'blocks' IS DISTINCT FROM OLD.\"data\"::jsonb->'blocks') AND (NEW.\"data\"::jsonb->>'sourceRevision')::bigint <= (OLD.\"data\"::jsonb->>'sourceRevision')::bigint)`\n : `NEW.\"data\"::jsonb->'noteId' IS DISTINCT FROM OLD.\"data\"::jsonb->'noteId' OR NEW.\"data\"::jsonb->'blockId' IS DISTINCT FROM OLD.\"data\"::jsonb->'blockId' OR NEW.\"data\"::jsonb->'blockVersion' IS DISTINCT FROM OLD.\"data\"::jsonb->'blockVersion'`;\n const code = def.name === 'block_revisions' ? 'revision_conflict' : def.name === 'notes' ? 'transaction_conflict' : 'invalid_session_pin';\n const guard = `${def.name}_guard`;\n await conn.exec(`CREATE OR REPLACE FUNCTION \"${guard}\"() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF ${condition} THEN RAISE EXCEPTION '${code}'; END IF; RETURN NEW; END; $$`);\n await conn.exec(`DROP TRIGGER IF EXISTS \"${guard}\" ON \"${def.name}\"`);\n await conn.exec(`CREATE TRIGGER \"${guard}\" BEFORE ${def.name === 'block_revisions' ? 'INSERT' : 'UPDATE'} ON \"${def.name}\" FOR EACH ROW EXECUTE FUNCTION \"${guard}\"()`);\n }\n}\n\n/** Internal schema metadata is not exposed or cleared by the store API. */\nexport async function initializeStore(db: Database): Promise<void> {\n await db.transaction(async (tx) => {\n await tx.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n const storeTables = new Set<string>(STORE_DEFS.map((d) => d.name));\n const tableNames = new Set(\n (await tx.query(tableListSql(db.dialect))).map((r) => String(Object.values(r)[0])),\n );\n const guardRows = await tx.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [SCHEMA_KEY]);\n let stored: number | undefined;\n if (guardRows[0]) {\n const guard = JSON.parse(String(guardRows[0].value)) as { version?: unknown };\n if (typeof guard.version !== 'number') {\n throw new StorageError(500, `corrupt ${SCHEMA_TABLE} guard row`, 'bad_schema_guard');\n }\n stored = guard.version;\n if (stored !== DB_VERSION) {\n throw new StorageError(\n 500,\n `database schema v${stored} is incompatible with v${DB_VERSION}; recreation required using an explicitly disposable database`,\n 'schema_incompatible',\n );\n }\n } else if ([...tableNames].some((name) => storeTables.has(name))) {\n throw new StorageError(\n 500,\n 'database contains store tables but no wod-wiki schema guard; refusing to adopt a foreign database — point SQLITE_PATH/DATABASE_URL at a fresh database',\n 'foreign_database',\n );\n }\n for (const def of STORE_DEFS) await ensureStoreTables(tx, db.dialect, def);\n if (stored !== DB_VERSION) {\n await tx.exec(\n `INSERT INTO \"${SCHEMA_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO UPDATE SET \"value\" = excluded.\"value\"`,\n [SCHEMA_KEY, JSON.stringify({ version: DB_VERSION })],\n );\n }\n });\n}\n","/** Current Note and actionable-block SQL projections. */\n\nimport type { Database, SqlConnection, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport { putRows, deleteRows, clearRows, getRows, listRows, storeDefinition, SCHEMA_TABLE, batchInsert, deleteIn } from './store';\nimport { decodeRowJson, encodeRowJson } from './codec';\nimport type { StoreDef } from '../schema';\nimport type { StoreName } from '../contract';\nimport {\n DOMAIN_PROJECTION_VERSION,\n type DomainPredicate,\n type DomainQueryResult,\n} from '../domain';\nimport { isRange, keyFromValue, type KeyDTO, type RangeDTO, type TxOp } from '../wire';\n// The app's own source/catalog semantics — no duplicated matchers.\nimport { catalogOfItem, sourceMatches } from '@bitcobblers/wod-wiki-wql';\nimport { rowsEqual, validateStoredPins } from '../validation';\nimport type { BlockRevision, Note, Session } from '../entities';\n\nconst TABLES = ['domain_note', 'query_block'] as const;\n\nconst PROJECTION_GUARD_KEY = 'domain_projection';\n\ntype SourceItem = Parameters<typeof sourceMatches>[0];\n\nfunction sourceItem(row: Record<string, unknown>): SourceItem {\n const item: SourceItem = {};\n for (const key of ['id', 'noteId', 'sourceId', 'type', 'seedOrigin', 'seedChunkId', 'sourcePath', 'catalog'] as const) {\n const value = row[key];\n if (typeof value === 'string') item[key] = value;\n else if (value != null) throw new StorageError(400, `${key} must be a string`);\n }\n return item;\n}\n\ninterface NoteIdentity { note_id: string; date: number | null; created_at: number; note: Note }\n\nconst num = (v: unknown): number | null => (typeof v === 'number' && Number.isFinite(v) ? v : null);\nconst text = (v: unknown): string | null => (typeof v === 'string' ? v : null);\nconst T = (v: unknown): SqlValue => (text(v) as SqlValue) ?? null;\nconst N = (v: unknown): SqlValue => num(v) ?? 0;\n\n// ── DDL (engine-neutral; numeric suffix only differs on postgres) ──────────\n\nfunction ensureDdl(db: Database): Promise<void> {\n const n = db.dialect === 'postgres' ? ' DOUBLE PRECISION' : '';\n const t = db.dialect === 'postgres' ? ' TEXT COLLATE \"C\"' : ' TEXT';\n const ddl = [\n `CREATE TABLE IF NOT EXISTS \"domain_note\" (\"note_id\"${t} PRIMARY KEY NOT NULL, \"note_type\"${t}, \"catalog\"${t}, \"source_id\"${t}, \"source_path\"${t}, \"title\"${t} NOT NULL, \"title_search\"${t} NOT NULL, \"created_at\"${n} NOT NULL, \"date\"${n}, \"text_search\"${t} NOT NULL, \"journal\"${n} NOT NULL, \"payload\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_date\" ON \"domain_note\" (\"date\", \"note_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_created\" ON \"domain_note\" (\"created_at\", \"note_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_source_path\" ON \"domain_note\" (\"source_path\")`,\n `CREATE TABLE IF NOT EXISTS \"query_block\" (\"occurrence_id\"${t} PRIMARY KEY NOT NULL, \"source_note_id\"${t}, \"parent_note_id\"${t}, \"content_id\"${t}, \"section_key\"${t}, \"ordinal\"${n}, \"data_type\"${t}, \"source_id\"${t}, \"source_path\"${t}, \"catalog\"${t}, \"effective_date\"${n} NOT NULL, \"created_at\"${n} NOT NULL, \"note_title\"${t}, \"normalized_text\"${t} NOT NULL, \"journal\"${n} NOT NULL, \"payload\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_type\" ON \"query_block\" (\"data_type\", \"effective_date\", \"occurrence_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_parent\" ON \"query_block\" (\"parent_note_id\", \"ordinal\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_content\" ON \"query_block\" (\"content_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_source_path\" ON \"query_block\" (\"source_path\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_source_note\" ON \"query_block\" (\"source_note_id\")`,\n ];\n return db.transaction(async (tx) => {\n for (const sql of ddl) await tx.exec(sql);\n });\n}\n\n\nconst DOMAIN_NOTE_COLS = ['note_id','note_type','catalog','source_id','source_path','title','title_search','created_at','date','text_search','journal','payload'] as const;\nconst QUERY_BLOCK_COLS = ['occurrence_id','source_note_id','parent_note_id','content_id','section_key','ordinal','data_type','source_id','source_path','catalog','effective_date','created_at','note_title','normalized_text','journal','payload'] as const;\n\nconst conflictUpdate = (cols: readonly string[], keys: readonly string[]): string =>\n `ON CONFLICT (${keys.map((k) => `\"${k}\"`).join(', ')}) DO UPDATE SET ` +\n cols.filter((c) => !keys.includes(c)).map((c) => `\"${c}\" = excluded.\"${c}\"`).join(',') +\n ` WHERE ` + cols.filter(col => !keys.includes(col)).map(col => `\"${col}\" IS DISTINCT FROM excluded.\"${col}\"`).join(' OR ');\n\n/** One domain_note row; undefined when the note has no identity (store write\n * still succeeds — nothing to project). */\nfunction domainNoteRow(note: Record<string, unknown>): SqlValue[] | undefined {\n const id = text(note.id);\n if (!id) return undefined;\n const source = sourceItem(note);\n return [\n id,\n T(note.type),\n T(catalogOfItem(source)),\n T(note.sourceId),\n T(note.sourcePath),\n T(note.title) ?? '',\n (text(note.title) ?? '').toLowerCase(),\n N(note.createdAt),\n num(note.date),\n (text(note.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(note),\n ];\n}\n\nasync function upsertDomainNotes(conn: SqlConnection, notes: Record<string, unknown>[]): Promise<void> {\n const rows = notes.map(domainNoteRow).filter((r): r is SqlValue[] => r !== undefined);\n await batchInsert(conn, 'domain_note', [...DOMAIN_NOTE_COLS], rows, conflictUpdate(DOMAIN_NOTE_COLS, ['note_id']));\n}\n\n\n/** One query_block row; undefined when the block has no identity. */\nfunction queryBlockRow(block: Record<string, unknown>, parent: NoteIdentity | undefined): SqlValue[] | undefined {\n const id = text(block.id);\n if (!id) return undefined;\n const source = sourceItem(block);\n const createdAt = N(block.createdAt);\n const effective = parent ? (parent.date ?? parent.created_at) : createdAt;\n return [\n id,\n T(block.noteId),\n parent?.note_id ?? null,\n T(block.blockContentId),\n T(block.blockId),\n num(block.position),\n T(block.dataType),\n T(block.sourceId),\n T(block.sourcePath),\n T(catalogOfItem(source)),\n effective,\n createdAt,\n parent?.note.title ?? T(block.noteTitle),\n (text(block.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(parent ? { ...block, noteTitle: parent.note.title } : block),\n ];\n}\n\nasync function upsertQueryBlocks(conn: SqlConnection, blocks: [Record<string, unknown>, NoteIdentity | undefined][]): Promise<void> {\n const rows = blocks.map(([b, p]) => queryBlockRow(b, p)).filter((r): r is SqlValue[] => r !== undefined);\n await batchInsert(conn, 'query_block', [...QUERY_BLOCK_COLS], rows, conflictUpdate(QUERY_BLOCK_COLS, ['occurrence_id']));\n}\n\n// ── Parent identity resolution ───────────────────────────────────────────────\n\ninterface ParentIndex { byNoteId: Map<string, NoteIdentity> }\n\nfunction indexNoteIdentities(notes: Iterable<Record<string, unknown>>): ParentIndex {\n const byNoteId = new Map<string, NoteIdentity>();\n for (const note of notes) {\n const id = text(note.id);\n if (id) byNoteId.set(id, { note_id: id, date: num(note.date), created_at: num(note.createdAt) ?? 0, note: note as unknown as Note });\n }\n return { byNoteId };\n}\n\nfunction resolveParentFrom(index: ParentIndex, block: Record<string, unknown>): NoteIdentity | undefined {\n const parent = typeof block.noteId === 'string' ? index.byNoteId.get(block.noteId) : undefined;\n const mapped = typeof block.blockId === 'string' ? parent?.note.blocks[block.blockId] : undefined;\n return parent && mapped && block.id === `${parent.note_id}:${mapped.id}`\n && block.blockVersion === mapped.version && block.dataType === mapped.kind\n && block.sourceRevision === parent.note.sourceRevision && block.from === mapped.from && block.to === mapped.to\n && block.rawContent === parent.note.rawContent.slice(mapped.from, mapped.to) ? parent : undefined;\n}\n\nasync function fetchParentIndex(conn: SqlConnection, noteIds: string[]): Promise<ParentIndex> {\n const notes = await getRows(conn, storeDefinition('notes'), noteIds);\n return indexNoteIdentities(notes.filter((row): row is Record<string, unknown> => row !== undefined));\n}\n\n// ── Per-key refresh ──────────────────────────────────────────────────────────\n\nconst keyHead = (key: KeyDTO): SqlValue => (Array.isArray(key) ? (key[0] as SqlValue) : key);\n\n/** Chunked `col IN (…)` SELECT returning the first column as strings. */\nasync function selectIn(conn: SqlConnection, selectCol: string, table: string, col: string, vals: SqlValue[]): Promise<string[]> {\n const IN_CHUNK = 500;\n const out: string[] = [];\n for (let i = 0; i < vals.length; i += IN_CHUNK) {\n const part = vals.slice(i, i + IN_CHUNK);\n const rows = await conn.query(`SELECT \"${selectCol}\" FROM \"${table}\" WHERE \"${col}\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const r of rows) out.push(String(r[selectCol]));\n }\n return out;\n}\n\nasync function healQueryBlocksForNotes(conn: SqlConnection, noteIds: string[]): Promise<void> {\n const ids = await selectIn(conn, 'occurrence_id', 'query_block', 'source_note_id', noteIds);\n await refreshBlocks(conn, [...new Set(ids)]);\n}\n\nasync function refreshNotes(conn: SqlConnection, ids: KeyDTO[]): Promise<void> {\n const ks = [...new Set(ids.map((id) => String(keyHead(id))))];\n if (ks.length === 0) return;\n const found = new Map<string, Record<string, unknown>>();\n for (let i = 0; i < ks.length; i += 500) {\n const part = ks.slice(i, i + 500);\n const rows = await conn.query(`SELECT \"k0\", \"data\" FROM \"notes\" WHERE \"k0\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const row of rows) found.set(String(row.k0), decodeRowJson<Record<string, unknown>>(String(row.data)));\n }\n const present: Record<string, unknown>[] = [];\n const missing: string[] = [];\n for (const k of ks) {\n const note = found.get(k);\n if (note) present.push(note);\n else missing.push(k);\n }\n await upsertDomainNotes(conn, present);\n const presentIds = present.map((n) => text(n.id)).filter((x): x is string => !!x);\n await healQueryBlocksForNotes(conn, presentIds);\n await deleteIn(conn, 'domain_note', 'note_id', missing);\n await deleteIn(conn, 'query_block', 'source_note_id', missing);\n await deleteIn(conn, 'block_index', 'i_by_note_0', missing);\n await deleteIn(conn, 'block_efforts', 'i_by_note_0', missing);\n}\n\n\nasync function refreshBlocks(conn: SqlConnection, ids: KeyDTO[]): Promise<void> {\n const ks = [...new Set(ids.map((id) => String(keyHead(id))))];\n if (ks.length === 0) return;\n const found = new Map<string, Record<string, unknown>>();\n for (let i = 0; i < ks.length; i += 500) {\n const part = ks.slice(i, i + 500);\n const rows = await conn.query(`SELECT \"k0\", \"data\" FROM \"block_index\" WHERE \"k0\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const row of rows) found.set(String(row.k0), decodeRowJson<Record<string, unknown>>(String(row.data)));\n }\n const blocks = [...found.values()];\n const noteIds = [...new Set(blocks.map((b) => text(b.noteId)).filter((x): x is string => !!x))];\n const index = await fetchParentIndex(conn, noteIds);\n await upsertQueryBlocks(conn, blocks.map((b) => [b, resolveParentFrom(index, b)]));\n await deleteIn(conn, 'query_block', 'occurrence_id', ks.filter((k) => !found.has(k)));\n}\n\ninterface Impact {\n notes: KeyDTO[];\n pinnedNotes: Note[];\n pinnedSessions: Session[];\n blocks: KeyDTO[];\n notesClear: boolean;\n blocksClear: boolean;\n}\n\nconst TRACKED: Partial<Record<StoreName, 'notes' | 'blocks'>> = {\n notes: 'notes',\n block_index: 'blocks',\n};\n\nasync function deleteTargetKeys(conn: SqlConnection, def: StoreDef, target: KeyDTO | RangeDTO): Promise<KeyDTO[]> {\n if (!isRange(target)) return [target];\n const rows = await listRows(conn, def, target);\n return rows.map((row) => keyFromValue(def, row));\n}\n\n/** Checks precede mutations; pins and projections commit with source rows. */\nexport async function refreshDomain(\n conn: SqlConnection,\n ops: TxOp[],\n): Promise<(KeyDTO | null)[]> {\n const impact: Impact = {\n notes: [], blocks: [], pinnedNotes: [], pinnedSessions: [],\n notesClear: false, blocksClear: false,\n };\n const results: (KeyDTO | null)[] = [];\n for (const op of ops) if (op === null || typeof op !== 'object' || Array.isArray(op)) throw new StorageError(400, 'tx op must be an object');\n const checks = ops.filter((op): op is Extract<TxOp, {op: 'check'}> => op.op === 'check');\n const checkStores = [...new Set(checks.map(op => op.store))];\n for (const store of checkStores) {\n const scoped = checks.filter(op => op.store === store);\n const actual = await getRows(conn, storeDefinition(store), scoped.map(op => op.key));\n scoped.forEach((op, i) => {\n if (!rowsEqual(actual[i] ?? null, op.value)) throw new StorageError(409, 'transaction read changed before commit', 'transaction_conflict');\n });\n }\n // Consecutive puts on one store flush as chunked multi-row INSERTs; the\n // flush also precedes any delete/clear so range deletes observe them.\n let pending: { def: StoreDef; values: unknown[] } | undefined;\n const flushPuts = async (): Promise<void> => {\n if (!pending) return;\n const batch = pending;\n pending = undefined;\n if (batch.values.length === 0) return;\n const changed: KeyDTO[] = [];\n const keys = await putRows(conn, batch.def, batch.values, changed);\n const slot = TRACKED[batch.def.name];\n if (slot) impact[slot].push(...changed);\n const changedSet = new Set(changed.map(key => JSON.stringify(key)));\n if (batch.def.name === 'notes') impact.pinnedNotes.push(...batch.values.filter(value => changedSet.has(JSON.stringify(keyFromValue(batch.def, value)))) as Note[]);\n if (batch.def.name === 'sessions') impact.pinnedSessions.push(...batch.values.filter(value => changedSet.has(JSON.stringify(keyFromValue(batch.def, value)))) as Session[]);\n results.push(...keys);\n };\n for (const op of ops) {\n if (op.op === 'check') { results.push(null); continue; }\n const store = 'store' in op ? op.store : undefined;\n const def = storeDefinition(typeof store === 'string' ? store : String(store));\n const kind: unknown = typeof op.op === 'string' ? op.op : undefined; // runtime junk tolerated\n if (op.op === 'put') {\n if (pending && pending.def.name !== def.name) await flushPuts();\n (pending ??= { def, values: [] }).values.push(op.value);\n } else if (op.op === 'delete') {\n await flushPuts();\n const slot = TRACKED[def.name];\n if (slot) {\n // op.key types as KeyDTO on the wire, but deleteRows honours ranges too.\n for (const key of await deleteTargetKeys(conn, def, op.key as KeyDTO | RangeDTO)) impact[slot].push(key);\n }\n await deleteRows(conn, def, op.key as KeyDTO | RangeDTO);\n results.push(null);\n } else if (op.op === 'clear') {\n await flushPuts();\n await clearRows(conn, def);\n if (def.name === 'notes') impact.notesClear = true;\n else if (def.name === 'block_index') impact.blocksClear = true;\n results.push(null);\n } else {\n throw new StorageError(400, `tx op must be check | put | delete | clear, got: ${String(kind)}`);\n }\n }\n await flushPuts();\n const finalNotes = (await getRows(conn, storeDefinition('notes'), [...new Set(impact.pinnedNotes.map(note => note.id))])).filter(Boolean) as Note[];\n const finalSessions = (await getRows(conn, storeDefinition('sessions'), [...new Set(impact.pinnedSessions.map(session => session.id))])).filter(Boolean) as Session[];\n await validateStoredPins(finalNotes, finalSessions, keys => getRows(conn, storeDefinition('block_revisions'), keys as KeyDTO[]) as Promise<(BlockRevision | undefined)[]>);\n await refresh(conn, impact);\n return results;\n}\n\nasync function refresh(conn: SqlConnection, impact: Impact): Promise<void> {\n // Clears stage first: a tx of [clear, put n1] must end with exactly n1\n // projected, and [put n1, clear] with nothing — clearing the derived rows\n // before re-projecting surviving keys satisfies both orders.\n if (impact.notesClear) {\n await conn.exec(`DELETE FROM \"domain_note\"`);\n await conn.exec(`DELETE FROM \"query_block\" WHERE \"source_note_id\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n await conn.exec(`DELETE FROM \"block_index\" WHERE \"i_by_note_0\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n await conn.exec(`DELETE FROM \"block_efforts\" WHERE \"i_by_note_0\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n }\n if (impact.blocksClear) await conn.exec(`DELETE FROM \"query_block\"`);\n await refreshNotes(conn, impact.notes);\n await refreshBlocks(conn, impact.blocks);\n}\n\n/**\n * Rebuild the derived tables from the source-of-truth store rows and stamp\n * the projection guard. Caller owns the transaction (atomicity) — the guard\n * row commits together with the rebuilt rows.\n */\nexport async function rebuildProjections(conn: SqlConnection): Promise<void> {\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n for (const t of TABLES) await conn.exec(`DELETE FROM \"${t}\"`);\n const notes = await conn.query(`SELECT \"data\" FROM \"notes\"`);\n const noteObjs = notes.map((row) => decodeRowJson<Record<string, unknown>>(String(row.data)));\n await upsertDomainNotes(conn, noteObjs);\n const blocks = await conn.query(`SELECT \"data\" FROM \"block_index\"`);\n const blockObjs = blocks.map((row) => decodeRowJson<Record<string, unknown>>(String(row.data)));\n // domain_note was just rebuilt from exactly these notes — parent identity\n // resolves in memory instead of one query per block.\n const index = indexNoteIdentities(noteObjs);\n await upsertQueryBlocks(conn, blockObjs.map((b) => [b, resolveParentFrom(index, b)]));\n await conn.exec(\n `INSERT INTO \"${SCHEMA_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO UPDATE SET \"value\" = excluded.\"value\"`,\n [PROJECTION_GUARD_KEY, JSON.stringify({ version: DOMAIN_PROJECTION_VERSION })],\n );\n}\n\n/** Boot-time derived state: DDL + rebuild only when the guard is incompatible\n * (first run, projection version bump, or an interrupted prior rebuild). */\nexport async function initializeDomain(db: Database): Promise<void> {\n await ensureDdl(db);\n await db.transaction(async (tx) => {\n await tx.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n const guardRows = await tx.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [PROJECTION_GUARD_KEY]);\n let guard: { version?: unknown } | undefined;\n if (guardRows[0]) {\n try {\n guard = JSON.parse(String(guardRows[0].value)) as { version?: unknown };\n } catch {\n guard = undefined; // corrupt guard → rebuild and restamp\n }\n }\n if (guard?.version === DOMAIN_PROJECTION_VERSION) return;\n await rebuildProjections(tx);\n });\n}\n\n/** Clears derived tables after a data wipe (empty is a consistent state). */\nexport async function wipeDomain(conn: SqlConnection): Promise<void> {\n for (const t of TABLES) await conn.exec(`DELETE FROM \"${t}\"`);\n}\n\n// ── Domain query execution ───────────────────────────────────────────────────\n\nexport const MAX_BODY = 64 * 1024;\nconst MAX_CLAUSES = 32;\nconst MAX_VALUES = 64;\nconst MAX_VALUE_LEN = 256;\nconst MAX_ORDER = 4;\n\ntype Plan = 'notes' | 'blocks' | 'entries';\n\nconst listFields = ['id', 'noteId', 'type', 'catalog', 'source', 'tags', 'effort'] as const;\n\nconst onlyKeys = (obj: Record<string, unknown>, allowed: string[]): boolean =>\n Object.keys(obj).every((k) => allowed.includes(k));\n\nfunction bad(msg: string): StorageError {\n return new StorageError(400, msg);\n}\n\nfunction strArray(v: unknown, what: string): string[] {\n if (!Array.isArray(v) || v.length < 1 || v.length > MAX_VALUES) {\n throw bad(`${what} needs 1..=${MAX_VALUES} values`);\n }\n return v.map((x) => {\n if (typeof x !== 'string' || x.length < 1 || x.length > MAX_VALUE_LEN) {\n throw bad(`${what} values must be 1..=${MAX_VALUE_LEN} chars`);\n }\n return x;\n });\n}\n\n/** Strict predicate parse — unknown/missing/duplicate payload keys are 400. */\nfunction parsePredicate(v: unknown, plan: Plan): DomainPredicate {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) throw bad('predicate must be an object');\n const obj = v as Record<string, unknown>;\n const field = obj.field;\n if (typeof field !== 'string') throw bad('predicate.field required');\n let negate = false;\n if ('negate' in obj) {\n if (typeof obj.negate !== 'boolean') throw bad('predicate.negate must be boolean');\n negate = obj.negate;\n }\n if ((listFields as readonly string[]).includes(field)) {\n if (!onlyKeys(obj, ['field', 'values', 'negate'])) {\n throw bad(`predicate ${field} accepts only field/values/negate`);\n }\n return { field, values: strArray(obj.values, `predicate ${field}.values`), ...(negate ? { negate } : {}) } as DomainPredicate;\n }\n if (field === 'text') {\n if (!onlyKeys(obj, ['field', 'value']) || negate) throw bad('predicate text accepts only {field, value}');\n if (typeof obj.value !== 'string' || obj.value.length < 1 || obj.value.length > MAX_VALUE_LEN) {\n throw bad('predicate text.value must be 1..=256 chars');\n }\n return { field: 'text', value: obj.value };\n }\n if (field === 'date') {\n if (!onlyKeys(obj, ['field', 'start', 'end', 'endExclusive'])) {\n throw bad('predicate date accepts only field/start/end/endExclusive');\n }\n const n = (k: string): number => {\n if (typeof obj[k] !== 'number' || !Number.isFinite(obj[k])) throw bad(`predicate date.${k} must be a finite number`);\n return obj[k];\n };\n if ('endExclusive' in obj && typeof obj.endExclusive !== 'boolean') {\n throw bad('predicate date.endExclusive must be boolean');\n }\n return { field: 'date', start: n('start'), end: n('end'), ...(obj.endExclusive === true ? { endExclusive: true } : {}) };\n }\n if (field === 'page') {\n if (plan === 'blocks') throw bad('predicate page does not apply to the blocks plan');\n if (!onlyKeys(obj, ['field', 'value'])) throw bad('predicate page accepts only {field, value}');\n if (typeof obj.value !== 'boolean') throw bad('predicate page.value must be boolean');\n return { field: 'page', value: obj.value };\n }\n if (field === 'sourceFence') {\n if (!onlyKeys(obj, ['field'])) throw bad('predicate sourceFence accepts only {field}');\n return { field: 'sourceFence' };\n }\n if (field === 'defaultNotes') {\n if (plan === 'blocks') throw bad('predicate defaultNotes does not apply to the blocks plan');\n if (!onlyKeys(obj, ['field', 'feeds'])) throw bad('predicate defaultNotes accepts only {field, feeds}');\n if (typeof obj.feeds !== 'boolean') throw bad('predicate defaultNotes.feeds must be boolean');\n return { field: 'defaultNotes', feeds: obj.feeds };\n }\n throw bad(`unknown predicate field: ${field}`);\n}\n\nfunction parseClauses(v: unknown, plan: Plan, what: string): DomainPredicate[] {\n if (v === undefined) return [];\n if (!Array.isArray(v)) throw bad(`${what} must be an array`);\n if (v.length > MAX_CLAUSES) throw bad(`${what} supports at most ${MAX_CLAUSES} clauses`);\n return v.map((p) => parsePredicate(p, plan));\n}\n\nfunction orderCols(field: string, plan: Plan): string {\n if (field === 'id' || field === 'createdAt') return field;\n if (plan === 'blocks') {\n if (field === 'noteTitle' || field === 'dataType' || field === 'position') return field;\n throw bad(field === 'date' || field === 'title' ? `order ${field} does not apply to the blocks plan` : `unknown order field: ${field}`);\n }\n if (field === 'date' || field === 'title') return field;\n throw bad(\n field === 'noteTitle' || field === 'dataType' || field === 'position'\n ? `order ${field} only applies to the blocks plan`\n : `unknown order field: ${field}`,\n );\n}\n\ninterface ParsedQuery {\n plan: Plan;\n selection: DomainPredicate[];\n filters: DomainPredicate[];\n order: { field: string; desc: boolean }[];\n offset: number;\n limit?: number;\n}\n\nfunction parseQuery(body: unknown): ParsedQuery {\n if (body === null || typeof body !== 'object' || Array.isArray(body)) throw bad('body must be a DomainQuery object');\n const obj = body as Record<string, unknown>;\n const plan = obj.plan;\n if (plan !== 'notes' && plan !== 'blocks' && plan !== 'entries') {\n throw bad('body.plan must be notes | blocks | entries');\n }\n for (const k of Object.keys(obj)) {\n if (!['plan', 'selection', 'filters', 'order', 'offset', 'limit'].includes(k)) {\n throw bad(`unknown DomainQuery field: ${k}`);\n }\n }\n const order: { field: string; desc: boolean }[] = [];\n if (obj.order !== undefined) {\n if (!Array.isArray(obj.order)) throw bad('order must be an array');\n if (obj.order.length > MAX_ORDER) throw bad(`order supports at most ${MAX_ORDER} keys`);\n for (const entry of obj.order) {\n if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) throw bad('order entries must be objects');\n const e = entry as Record<string, unknown>;\n if (typeof e.field !== 'string') throw bad('order.field required');\n if (!onlyKeys(e, ['field', 'direction'])) throw bad('order entries accept only field/direction');\n if (e.direction !== undefined && e.direction !== 'asc' && e.direction !== 'desc') {\n throw bad('order.direction must be asc | desc');\n }\n order.push({ field: orderCols(e.field, plan), desc: e.direction === 'desc' });\n }\n }\n const intIn = (k: string): number | undefined => {\n const v = obj[k];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'number' || !Number.isInteger(v)) throw bad(`${k} must be an integer`);\n if (v < 0) throw bad(`${k} must be >= 0`);\n return v;\n };\n // Omitted limit = complete matched set; an explicit limit is the caller's\n // paging choice, never silently truncated.\n return {\n plan,\n selection: parseClauses(obj.selection, plan, 'selection'),\n filters: parseClauses(obj.filters, plan, 'filters'),\n order,\n offset: intIn('offset') ?? 0,\n limit: intIn('limit'),\n };\n}\n\n// ── Predicate → SQL (bound values only) ──────────────────────────────────────\n\nclass Sql {\n readonly params: SqlValue[] = [];\n constructor(readonly pg: boolean) {}\n bind(v: SqlValue): string {\n this.params.push(v);\n return '?';\n }\n /** Literal substring over a lowercased materialized column — no wildcards. */\n contains(col: string, needle: string): string {\n const p = this.bind(needle.toLowerCase());\n return this.pg ? `strpos(${col}, ${p}) > 0` : `instr(${col}, ${p}) > 0`;\n }\n inList(col: string, values: string[]): string {\n return `${col} IN (${values.map((v) => this.bind(v)).join(', ')})`;\n }\n}\n\n/** WQL source domain — mirrors WQL_SOURCE_VALUES; the non-shape kinds\n * (dashboards/efforts) are exact sourceId literals, journal is materialized. */\nconst SOURCE_ALL_KINDS = ['journal', 'feeds', 'guides', 'playground', 'dashboards', 'efforts'];\n\nfunction sourceKindSql(ctx: Sql, kind: string, sid: string, typeExpr: string | null, journalCol: string): string {\n switch (kind) {\n case 'journal':\n return `(${journalCol} = 1)`;\n case 'feed':\n case 'feeds':\n // Storage identities keep the collection:/page:collection: prefixes.\n return `(substr(${sid}, 1, 11) = 'collection:' OR substr(${sid}, 1, 16) = 'page:collection:')`;\n case 'page':\n case 'pages':\n return `(${sid} = 'page' OR substr(${sid}, 1, 5) = 'page:' OR substr(${sid}, 1, 7) = 'guides:')`;\n case 'guide':\n case 'guides':\n return `(substr(${sid}, 1, 7) = 'guides:')`;\n case 'playground':\n return typeExpr\n ? `(${sid} = 'playground' OR (${typeExpr} IS NOT NULL AND ${typeExpr} = 'playground'))`\n : `(${sid} = 'playground')`;\n default:\n // Exact sourceId literal; NULL sourceId never equals a value.\n return `(${sid} = ${ctx.bind(kind)})`;\n }\n}\n\nfunction sourcePredicateSql(ctx: Sql, values: string[], negate: boolean, sid: string, typeExpr: string | null, journalCol: string): string {\n const matched = values.map((v) => sourceKindSql(ctx, v, sid, typeExpr, journalCol)).join(' OR ');\n return negate ? `NOT COALESCE((${matched}), FALSE)` : matched;\n}\n\nconst wrap = (negate: boolean, matchSql: string): string =>\n negate ? `NOT COALESCE ((${matchSql}), FALSE)` : matchSql;\n\nfunction predicateSql(ctx: Sql, p: DomainPredicate, plan: Plan): string {\n const blocks = plan === 'blocks';\n const id = blocks ? 'q.\"occurrence_id\"' : 'n.\"note_id\"';\n const sid = blocks ? 'q.\"source_id\"' : 'n.\"source_id\"';\n const typeExpr = blocks ? null : 'n.\"note_type\"';\n const typeCol = blocks ? 'q.\"data_type\"' : 'n.\"note_type\"';\n const catalogCol = blocks ? 'q.\"catalog\"' : 'n.\"catalog\"';\n const journalCol = blocks ? 'q.\"journal\"' : 'n.\"journal\"';\n const noteId = blocks ? 'q.\"source_note_id\"' : 'n.\"note_id\"';\n switch (p.field) {\n case 'id':\n return wrap(p.negate === true, ctx.inList(id, p.values));\n case 'noteId':\n return wrap(p.negate === true, ctx.inList(noteId, p.values));\n case 'type':\n return wrap(p.negate === true, ctx.inList(typeCol, p.values));\n case 'catalog':\n return wrap(p.negate === true, ctx.inList(catalogCol, p.values));\n case 'source':\n return sourcePredicateSql(ctx, p.values, p.negate === true, sid, typeExpr, journalCol);\n case 'tags':\n // Tags hang off the parent note on both planes.\n return wrap(\n p.negate === true,\n `EXISTS (SELECT 1 FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" ` +\n `WHERE nt.\"i_by_note_0\" = ${noteId} AND t.\"i_by_label_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'effort':\n return wrap(\n p.negate === true,\n blocks\n ? `(q.\"content_id\" IS NOT NULL AND EXISTS (SELECT 1 FROM \"block_efforts\" be ` +\n `WHERE be.\"i_by_block_0\" = q.\"content_id\" AND be.\"i_by_effort_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')})))`\n : `EXISTS (SELECT 1 FROM \"block_efforts\" be WHERE be.\"i_by_note_0\" = ${noteId} ` +\n `AND be.\"i_by_effort_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'text':\n return blocks ? ctx.contains('q.\"normalized_text\"', p.value)\n : `(${ctx.contains('n.\"title_search\"', p.value)} OR ${ctx.contains('n.\"text_search\"', p.value)})`;\n case 'date': {\n const expr = blocks ? 'q.\"effective_date\"' : 'COALESCE(n.\"date\", n.\"created_at\")';\n const lo = ctx.bind(p.start);\n const hi = ctx.bind(p.end);\n const cmp = p.endExclusive ? '<' : '<=';\n return `(${expr} >= ${lo} AND ${expr} ${cmp} ${hi})`;\n }\n case 'page':\n return p.value ? `n.\"note_type\" = 'page'` : `(n.\"note_type\" IS NULL OR n.\"note_type\" <> 'page')`;\n case 'sourceFence': {\n const all = SOURCE_ALL_KINDS.map((k) => sourceKindSql(ctx, k, sid, typeExpr, journalCol)).join(' OR ');\n return `(${sid} IS NULL OR ${sid} = '' OR ${all})`;\n }\n case 'defaultNotes':\n return p.feeds\n ? `(n.\"note_type\" IS NULL OR n.\"note_type\" <> 'page')`\n : `(n.\"note_type\" = 'note' OR (substr(COALESCE(n.\"source_id\", ''), 1, 5) <> 'page:' ` +\n `AND substr(COALESCE(n.\"source_id\", ''), 1, 7) <> 'guides:' ` +\n `AND COALESCE(n.\"note_type\", '') NOT IN ('feed','syntax','behavior','analytics','dashboard','home','page')))`;\n }\n}\n\nfunction clausesSql(ctx: Sql, clauses: DomainPredicate[], plan: Plan): string {\n if (clauses.length === 0) return '';\n return ` WHERE ${clauses.map((p) => predicateSql(ctx, p, plan)).join(' AND ')}`;\n}\n\nfunction orderSql(order: { field: string; desc: boolean }[], plan: Plan): string {\n const idCol = plan === 'blocks' ? 'q.\"occurrence_id\"' : 'n.\"note_id\"';\n const cols: Record<string, string> =\n plan === 'blocks'\n ? { id: 'q.\"occurrence_id\"', createdAt: 'q.\"created_at\"', noteTitle: 'q.\"note_title\"', dataType: 'q.\"data_type\"', position: 'q.\"ordinal\"' }\n : { id: 'n.\"note_id\"', createdAt: 'n.\"created_at\"', date: 'n.\"date\"', title: 'n.\"title\"' };\n // Deterministic paging: pinned NULL placement (sqlite and pg disagree on\n // defaults) plus the primary key as final tiebreaker.\n const parts = order.map(({ field, desc }) =>\n desc ? `${cols[field]} DESC NULLS FIRST` : `${cols[field]} ASC NULLS LAST`,\n );\n if (!order.some((o) => o.field === 'id')) parts.push(`${idCol} ASC`);\n return parts.join(', ');\n}\n\nfunction pagingSql(q: ParsedQuery, pg: boolean): string {\n let s = '';\n if (q.limit !== undefined) s += ` LIMIT ${q.limit}`;\n else if (q.offset > 0 && !pg) s += ' LIMIT -1'; // sqlite needs LIMIT before OFFSET\n if (q.offset > 0) s += ` OFFSET ${q.offset}`;\n return s;\n}\n\n/** Fail closed while any projected block lacks a resolved parent identity. */\nasync function gate(conn: SqlConnection): Promise<void> {\n const rows = await conn.query(`SELECT COUNT(*) AS \"n\" FROM \"query_block\" WHERE \"parent_note_id\" IS NULL`);\n const stale = Number(rows[0]?.n ?? 0);\n if (stale > 0) {\n throw new StorageError(\n 409,\n `domain projections stale: ${stale} block rows have invalid or unresolved current parents`,\n 'domain_projection_unavailable',\n );\n }\n}\n\nfunction planTable(plan: Plan): string {\n return plan === 'blocks' ? '\"query_block\" q' : '\"domain_note\" n';\n}\n\nasync function execute(conn: SqlConnection, q: ParsedQuery, pg: boolean): Promise<DomainQueryResult> {\n const plan = q.plan;\n const table = planTable(plan);\n\n const selCtx = new Sql(pg);\n const selWhere = clausesSql(selCtx, q.selection, plan);\n const filterCtx = new Sql(pg);\n const filterWhere = clausesSql(filterCtx, q.filters, plan);\n const allParams: SqlValue[] = [...selCtx.params, ...filterCtx.params];\n const fullWhere =\n selWhere && filterWhere\n ? `${selWhere} AND ${filterWhere.replace(/^ WHERE /, '')}`\n : selWhere || filterWhere;\n\n const count = async (where: string, params: SqlValue[]): Promise<number> =>\n Number((await conn.query(`SELECT COUNT(*) AS \"n\" FROM ${table}${where}`, params))[0]?.n ?? 0);\n const selectedCount = await count(selWhere, selCtx.params);\n const matchedCount = q.filters.length === 0 ? selectedCount : await count(fullWhere, allParams);\n\n const ordering = orderSql(q.order, plan);\n const paging = pagingSql(q, pg);\n\n if (plan !== 'entries') {\n const pageSql = `SELECT \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const rows: unknown[] = (await conn.query(pageSql, allParams)).map((r) => decodeRowJson(String(r.payload)));\n const result = { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount, matchedCount, plan, rows };\n // Parsed payloads re-typed by the shared plan schema (JSON columns are unknown).\n return result as DomainQueryResult;\n }\n\n const pageSql = `SELECT \"note_id\", \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const noteRows = await conn.query(pageSql, allParams);\n const buckets: [unknown[], unknown[], unknown[]][] = noteRows.map(() => [[], [], []]);\n const index = new Map<string, number>();\n noteRows.forEach((row, i) => index.set(String(row.note_id), i));\n for (let start = 0; start < noteRows.length; start += 500) {\n const ids = noteRows.slice(start, start + 500).map(row => String(row.note_id));\n const placeholders = ids.map(() => '?').join(', ');\n const statements = [\n { sql: `SELECT nt.\"i_by_note_0\" AS \"note_id\", t.\"data\" AS \"payload\" FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" WHERE nt.\"i_by_note_0\" IN (${placeholders}) ORDER BY t.\"k0\"`, params: ids },\n { sql: `SELECT p.\"i_by_note_0\" AS \"note_id\", p.\"data\" AS \"payload\" FROM \"page_notes\" p WHERE p.\"i_by_note_0\" IN (${placeholders}) ORDER BY p.\"k0\"`, params: ids },\n { sql: `SELECT DISTINCT p.\"i_by_note_0\" AS \"note_id\", pg.\"data\" AS \"payload\" FROM \"page_notes\" p JOIN \"page\" pg ON pg.\"k0\" = p.\"i_by_page_0\" WHERE p.\"i_by_note_0\" IN (${placeholders}) ORDER BY pg.\"data\"`, params: ids },\n ];\n const relations = conn.batch ? await conn.batch(statements) : await (async () => {\n const rows = [];\n for (const statement of statements) rows.push(await conn.query(statement.sql, statement.params));\n return rows;\n })();\n relations.forEach((rows, relation) => rows.forEach(row => {\n const i = index.get(String(row.note_id));\n if (i !== undefined) buckets[i][relation].push(decodeRowJson(String(row.payload)));\n }));\n }\n const rows = noteRows.map((row, i) => {\n const [tags, links, pages] = buckets[i];\n return { note: decodeRowJson(String(row.payload)), tags, links, pages };\n });\n return { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount, matchedCount, plan, rows } as DomainQueryResult;\n}\n\n/** Validate, gate, execute on one consistent snapshot (server route and\n * SqlStorage.queryDomain share this entry). */\nexport async function handleDomainQuery(db: Database, body: unknown): Promise<DomainQueryResult> {\n const query = parseQuery(body);\n return db.transaction(async (tx) => {\n // Counts and page must share one snapshot; writes keep the default level.\n if (db.dialect === 'postgres') await tx.exec('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY');\n await gate(tx);\n return execute(tx, query, db.dialect === 'postgres');\n });\n}\n","/** SQL storage with atomic, change-scoped projections and buffered reads. */\n\nimport type {\n IReadWriteStore,\n IReadOnlyStore,\n IStorage,\n IStorageTransaction,\n StoreName,\n StoreType,\n} from '../contract';\nimport type { DomainQuery, DomainQueryResult } from '../domain';\nimport { stampUserOwned } from '../membership';\nimport { STORE_DEFS, type StoreDef } from '../schema';\nimport {\n isRange,\n keyFromValue,\n rangeFromIDB,\n type KeyDTO,\n type RangeDTO,\n type TxOp,\n} from '../wire';\nimport {\n bufferedGet,\n bufferSlot,\n bufferToOps,\n isDirty,\n overlayRows,\n type BufferEntry,\n} from '../overlay';\nimport {\n countRows,\n getRow,\n initializeStore,\n listRows,\n putRow,\n wipeRows,\n getRows,\n listRowsFromIndexMany,\n} from './store';\nimport {\n handleDomainQuery,\n initializeDomain,\n refreshDomain,\n wipeDomain,\n} from './domain';\nimport { StorageError } from './errors';\nimport { libsqlDatabase, type Database, type SqlConnection } from './connection';\nimport { createClient } from '@libsql/client/web';\nimport { rowsEqual } from '../validation';\n\nexport interface SqlStorageOptions {\n /** Rows in user-owned stores are stamped with this userId on write. Omit\n * for stamp-free writers (data migration preserves ownership verbatim). */\n getUserId?: () => string;\n}\n\nexport class SqlStorage implements IStorage {\n private readonly db: Database;\n private readonly options: SqlStorageOptions;\n private readonly defs: Record<StoreName, StoreDef>;\n private readyPromise?: Promise<void>;\n\n constructor(db: Database, options: SqlStorageOptions = {}) {\n this.db = db;\n this.options = options;\n this.defs = Object.fromEntries(STORE_DEFS.map((d) => [d.name, d])) as Record<StoreName, StoreDef>;\n }\n\n /**\n * Idempotent schema + projection initialization. Cheap when already\n * compatible (both initializers are guard-protected); a failed attempt\n * clears the memo so the next call retries instead of caching the error.\n */\n ready(): Promise<void> {\n this.readyPromise ??= (async () => {\n try {\n await initializeStore(this.db);\n await initializeDomain(this.db);\n } catch (e) {\n this.readyPromise = undefined;\n throw e;\n }\n })();\n return this.readyPromise;\n }\n\n /** Every store operation starts here, so views created before (or during)\n * an in-flight ready() block until initialization actually succeeded. */\n ensureReady(): Promise<void> {\n return this.ready();\n }\n\n def(store: StoreName): StoreDef {\n const def = this.defs[store];\n if (!def) throw new StorageError(404, `SqlStorage: unknown store '${store}'`);\n return def;\n }\n\n private makeView<K extends StoreName>(\n store: K,\n conn: SqlConnection,\n mutable: boolean,\n buffer?: Map<string, BufferEntry>,\n cleared?: Set<StoreName>,\n ): IReadWriteStore<StoreType<K>> {\n return new SqlStore<StoreType<K>>(this, this.def(store), store, conn, mutable, buffer, cleared);\n }\n\n readonly<K extends StoreName>(store: K): IReadOnlyStore<StoreType<K>> {\n return this.makeView(store, this.db, false);\n }\n\n readwrite<K extends StoreName>(store: K): IReadWriteStore<StoreType<K>> {\n return this.makeView(store, this.db, true);\n }\n\n async queryDomain(query: DomainQuery): Promise<DomainQueryResult | undefined> {\n await this.ensureReady();\n try {\n return await handleDomainQuery(this.db, query);\n } catch (e) {\n // Same stale-projection fallback as ApiStorage's 409 mapping.\n if (e instanceof StorageError && e.code === 'domain_projection_unavailable') return undefined;\n throw e;\n }\n }\n\n async transaction<K extends StoreName, R>(\n stores: K[],\n mode: 'readonly' | 'readwrite',\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n await this.ensureReady();\n return this.runTx(stores, mode === 'readwrite', fn);\n }\n\n /** Bulk writes use the same affected-key refresh as ordinary transactions. */\n async bulkTransaction<K extends StoreName, R>(\n stores: K[],\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n await this.ensureReady();\n return this.runTx(stores, true, fn);\n }\n\n private runTx<K extends StoreName, R>(\n stores: K[],\n mutableMode: boolean,\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n const scoped = new Set<StoreName>(stores);\n const buffer = new Map<string, BufferEntry>();\n const cleared = new Set<StoreName>();\n return this.db.transaction(async (conn) => {\n const checkScope = (store: StoreName): void => {\n if (!scoped.has(store)) {\n throw new StorageError(400, `store '${store}' is outside this transaction's scope`, 'store_out_of_scope');\n }\n };\n const tx: IStorageTransaction = {\n readonly: <S extends StoreName>(store: S) => {\n checkScope(store);\n return this.makeView(store, conn, false, buffer, cleared);\n },\n readwrite: <S extends StoreName>(store: S) => {\n checkScope(store);\n if (!mutableMode) {\n throw new StorageError(403, 'transaction was opened readonly', 'read_only_transaction');\n }\n return this.makeView(store, conn, true, buffer, cleared);\n },\n };\n const result = await fn(tx);\n const ops = bufferToOps(STORE_DEFS.map((d) => d.name), buffer, cleared);\n if (ops.length > 0) {\n await refreshDomain(conn, ops);\n }\n return result;\n });\n }\n\n /**\n * Proves the backend accepts writes: one real INSERT into `meta` inside a\n * transaction that is then deliberately rolled back — zero rows committed.\n * A read-only backend, bad token or transport failure rejects here.\n */\n async verifyWritable(): Promise<void> {\n await this.ensureReady();\n const sentinel = new Error('verifyWritable: deliberate rollback sentinel');\n try {\n await this.db.transaction(async (conn) => {\n await putRow(conn, this.def('meta'), {\n key: `__wodwiki_write_check_${crypto.randomUUID()}`,\n value: '',\n });\n throw sentinel;\n });\n } catch (e) {\n if (e !== sentinel) throw e;\n }\n }\n\n async wipe(): Promise<void> {\n await this.ensureReady();\n await this.db.transaction(async (tx) => {\n await wipeRows(tx);\n await wipeDomain(tx);\n });\n }\n\n async close(): Promise<void> {\n await this.db.close();\n }\n\n // Internal seam for SqlStore views (same module): immediate op application\n // and write stamping.\n async applyOps(ops: TxOp[]): Promise<void> {\n await this.db.transaction((tx) => refreshDomain(tx, ops));\n }\n\n stamp(store: StoreName, value: unknown): unknown {\n const userId = this.options.getUserId?.();\n return userId ? stampUserOwned(store, value, userId) : value;\n }\n}\n\n/**\n * Store view over a SqlConnection. Outside a transaction writes apply\n * immediately (each in its own SQL tx with projection refresh); inside one,\n * writes buffer and reads overlay the buffer on committed rows. All\n * operations await backend readiness first.\n */\nclass SqlStore<T> implements IReadWriteStore<T> {\n constructor(\n private readonly owner: SqlStorage,\n private readonly def: StoreDef,\n private readonly store: StoreName,\n private readonly conn: SqlConnection,\n private readonly mutable: boolean,\n private readonly buffer?: Map<string, BufferEntry>,\n private readonly cleared?: Set<StoreName>,\n ) {}\n\n private assertMutable(): void {\n if (!this.mutable) {\n throw new StorageError(403, `${this.store} is opened read-only`, 'read_only_view');\n }\n }\n\n async get(key: IDBValidKey | RangeDTO): Promise<T | undefined> {\n await this.owner.ensureReady();\n const k = this.pointKey(key);\n const state = bufferedGet<T>(this.store, k, this.buffer);\n if (state) return state.hit ? state.value : undefined;\n if (this.cleared?.has(this.store)) return undefined;\n return getRow(this.conn, this.def, k) as Promise<T | undefined>;\n }\n\n async getMany(keys: IDBValidKey[]): Promise<(T | undefined)[]> {\n await this.owner.ensureReady();\n const normalized = keys.map(key => this.pointKey(key));\n const committed = this.cleared?.has(this.store) ? keys.map(() => undefined)\n : await getRows(this.conn, this.def, normalized) as (T | undefined)[];\n return normalized.map((key, i) => {\n const state = bufferedGet<T>(this.store, key, this.buffer);\n return state ? (state.hit ? state.value : undefined) : committed[i];\n });\n }\n\n async getAllFromIndexMany(indexName: string, keys: IDBValidKey[]): Promise<T[][]> {\n await this.owner.ensureReady();\n const rows = await listRowsFromIndexMany(this.conn, this.def, indexName, keys.map(key => this.pointKey(key)));\n return rows.map((values, i) => overlayRows<T>(this.def, this.store, this.buffer, this.cleared, values as T[], undefined, { only: this.pointKey(keys[i]) }, indexName));\n }\n\n async getAll(query?: IDBValidKey | IDBKeyRange | RangeDTO, count?: number): Promise<T[]> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n const rows = await listRows(this.conn, this.def, range, isDirty(this.store, this.buffer, this.cleared) ? undefined : count);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], count, range);\n }\n\n async getAllFromIndex(indexName: string, query?: IDBValidKey | IDBKeyRange | RangeDTO, count?: number): Promise<T[]> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n const rows = await listRows(this.conn, this.def, range, isDirty(this.store, this.buffer, this.cleared) ? undefined : count, indexName);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], count, range, indexName);\n }\n\n async count(query?: IDBValidKey | IDBKeyRange | RangeDTO): Promise<number> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n if (!isDirty(this.store, this.buffer, this.cleared)) return countRows(this.conn, this.def, range);\n const rows = await listRows(this.conn, this.def, range);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], undefined, range).length;\n }\n\n async countFromIndex(indexName: string, query?: IDBValidKey | IDBKeyRange | RangeDTO): Promise<number> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n if (!isDirty(this.store, this.buffer, this.cleared)) return countRows(this.conn, this.def, range, indexName);\n const rows = await listRows(this.conn, this.def, range, undefined, indexName);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], undefined, range, indexName).length;\n }\n\n async put(value: T, _key?: IDBValidKey): Promise<IDBValidKey> {\n await this.owner.ensureReady();\n this.assertMutable();\n const stored = this.owner.stamp(this.store, value) as T;\n const key = keyFromValue(this.def, stored);\n if (this.store === 'block_revisions') {\n const previous = this.buffer?.get(bufferSlot(this.store, key));\n if (previous?.kind === 'put' && !rowsEqual(previous.value, stored)) throw new StorageError(409, 'immutable block revision collision', 'revision_conflict');\n }\n if (this.buffer) {\n this.buffer.set(bufferSlot(this.store, key), { kind: 'put', value: stored });\n return key;\n }\n await this.owner.applyOps([{ op: 'put', store: this.store, value: stored }]);\n return key;\n }\n\n async putMany(values: T[], _keys?: IDBValidKey[]): Promise<IDBValidKey[]> {\n await this.owner.ensureReady();\n this.assertMutable();\n const stored = values.map(value => this.owner.stamp(this.store, value) as T);\n const keys = stored.map(value => keyFromValue(this.def, value));\n if (this.store === 'block_revisions') {\n const seen = new Map<string, unknown>();\n keys.forEach((key, i) => {\n const slot = bufferSlot(this.store, key), previous = this.buffer?.get(slot);\n const value = seen.has(slot) ? seen.get(slot) : previous?.kind === 'put' ? previous.value : undefined;\n if (value !== undefined && !rowsEqual(value, stored[i])) throw new StorageError(409, 'immutable block revision collision', 'revision_conflict');\n seen.set(slot, stored[i]);\n });\n }\n if (this.buffer) keys.forEach((key, i) => this.buffer!.set(bufferSlot(this.store, key), { kind: 'put', value: stored[i] }));\n else await this.owner.applyOps(stored.map(value => ({ op: 'put', store: this.store, value })));\n return keys;\n }\n\n async delete(key: IDBValidKey | IDBKeyRange | RangeDTO): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\n if (this.store === 'block_revisions') throw new StorageError(409, 'block history requires explicit wipe', 'revision_conflict');\n const range = isRange(key) ? key : undefined;\n const target = range ?? (key as KeyDTO);\n if (this.buffer) {\n if (range) {\n for (const row of await this.getAll(range)) {\n const rowKey = keyFromValue(this.def, row);\n this.buffer.set(bufferSlot(this.store, rowKey), { kind: 'delete', key: rowKey });\n }\n return;\n }\n const point = target as KeyDTO;\n this.buffer.set(bufferSlot(this.store, point), { kind: 'delete', key: point });\n return;\n }\n await this.owner.applyOps([{ op: 'delete', store: this.store, key: target as KeyDTO }]);\n }\n\n async clear(): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\n if (this.store === 'block_revisions') throw new StorageError(409, 'block history requires explicit wipe', 'revision_conflict');\n if (this.buffer) {\n this.cleared?.add(this.store);\n const prefix = `${this.store}\\u0000`;\n for (const slot of [...this.buffer.keys()]) {\n if (slot.startsWith(prefix)) this.buffer.delete(slot);\n }\n return;\n }\n await this.owner.applyOps([{ op: 'clear', store: this.store }]);\n }\n\n /** Normalizes get() arguments to a wire key (bounded ranges match no row). */\n private pointKey(key: IDBValidKey | RangeDTO): KeyDTO {\n if (isRange(key)) {\n if (key.only === undefined) {\n throw new StorageError(400, 'get() needs a plain key or {only}; bounded ranges match no single row');\n }\n return key.only;\n }\n return key as KeyDTO;\n }\n}\n\nexport interface TursoSettings {\n url: string;\n authToken?: string;\n}\n\n/** libsql/https/wss only; plain http only for loopback development; tokens\n * travel via authToken, never the URL. Rejects credentials, query strings\n * and fragments (no secret or option injection through the URL). */\nexport function validateTursoUrl(url: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new StorageError(400, 'invalid Turso URL', 'bad_turso_url');\n }\n if (url.includes('?') || url.includes('#')) {\n throw new StorageError(400, 'Turso URL must not carry a query or fragment; pass options/secrets via authToken', 'bad_turso_url');\n }\n if (parsed.username || parsed.password) {\n throw new StorageError(400, 'Turso URL must not embed credentials; pass them via authToken', 'bad_turso_url');\n }\n const loopback = parsed.hostname === '127.0.0.1' || parsed.hostname === 'localhost' || parsed.hostname === '[::1]';\n if (parsed.protocol === 'http:') {\n if (!loopback) {\n throw new StorageError(400, 'refusing plain http Turso URL (token would traverse the network unencrypted); use libsql:/https:', 'bad_turso_url');\n }\n return url;\n }\n if (parsed.protocol !== 'libsql:' && parsed.protocol !== 'https:' && parsed.protocol !== 'wss:') {\n throw new StorageError(400, `unsupported Turso URL scheme ${parsed.protocol} (expected libsql:, https:, wss:)`, 'bad_turso_url');\n }\n return url;\n}\n\n/**\n * Direct-from-browser Turso backend. Construction only validates and builds\n * the client; `await storage.ready()` initializes schema + projections.\n * Errors never embed the auth token.\n */\nexport class BrowserTursoStorage extends SqlStorage {\n constructor(settings: TursoSettings, options: SqlStorageOptions = {}) {\n super(\n libsqlDatabase(createClient({ url: validateTursoUrl(settings.url), authToken: settings.authToken })),\n options,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sql/connection.ts","../../src/sql/codec.ts","../../src/sql/store.ts","../../src/sql/domain.ts","../../src/sql/storage.ts","../../src/sql/sync.ts"],"names":["text","clauses","order","rows","params","pageSql","BINARY_FIELD"],"mappings":";;;;;;AAoCA,SAAS,WAAW,MAAA,EAAgE;AAClF,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAGO,SAAS,eAAe,MAAA,EAAgC;AAC7D,EAAA,IAAI,KAAA,GAA0B,QAAQ,OAAA,EAAQ;AAC9C,EAAA,MAAM,SAAA,GAAY,CAAI,EAAA,KAAqC;AACzD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,MAAA,EAAW,MAAM,MAAS,CAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IACT,OAAO,CAAC,GAAA,EAAK,SAAS,EAAC,KAAM,UAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,EAAE,KAAK,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IACnG,IAAA,EAAM,OAAO,GAAA,EAAK,MAAA,GAAS,EAAC,KAAM;AAChC,MAAA,MAAM,SAAA,CAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,EAAE,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,YAAe,EAAA,EAAmD;AAChE,MAAA,OAAO,UAAU,YAAY;AAC3B,QAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,WAAA,CAAY,OAAO,CAAA;AAC3C,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAwB;AAAA,YAC5B,KAAA,EAAO,CAAC,GAAA,EAAK,MAAA,GAAS,EAAC,KAAM,EAAA,CAAG,OAAA,CAAQ,EAAE,KAAK,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,KAAK,UAAU,CAAA;AAAA,YAC9E,IAAA,EAAM,OAAO,GAAA,EAAK,MAAA,GAAS,EAAC,KAAM;AAChC,cAAA,MAAM,GAAG,OAAA,CAAQ,EAAE,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA;AAAA,YACxC,CAAA;AAAA,YACA,KAAA,EAAO,OAAO,UAAA,KAAA,CAAgB,MAAM,GAAG,KAAA,CAAM,UAAA,CAAW,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,SAAS,EAAC,EAAE,MAAO,EAAE,GAAA,EAAK,IAAA,EAAM,QAAO,CAAE,CAAC,CAAA,EAAG,GAAA,CAAI,UAAU;AAAA,WACjI;AACA,UAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,MAAM,CAAA;AAC9B,UAAA,MAAM,GAAG,MAAA,EAAO;AAChB,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,GAAA,EAAK;AACZ,UAAA,IAAI;AACF,YAAA,MAAM,GAAG,QAAA,EAAS;AAAA,UACpB,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,UAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,mBAAA,EAAqB,sBAAA,EAAwB,qBAAqB,CAAA,EAAG;AACvF,YAAA,IAAI,OAAA,CAAQ,SAAS,IAAI,CAAA,QAAS,IAAI,YAAA,CAAa,GAAA,EAAK,OAAA,EAAS,IAAI,CAAA;AAAA,UACvE;AACA,UAAA,MAAM,GAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,EAAA,CAAG,KAAA,EAAM;AAAA,QACX;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,OAAO,YAAY;AACjB,MAAA,MAAM,KAAA;AACN,MAAA,MAAA,CAAO,KAAA,EAAM;AAAA,IACf;AAAA,GACF;AACF;;;AC5EA,IAAM,GAAA,GAAM,SAAA;AACZ,IAAM,GAAA,GAAM,QAAA;AAEZ,SAAS,cAAc,KAAA,EAA2B;AAChD,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,MAAM,KAAA,GAAQ,KAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,KAAA,EAAO;AAC5C,IAAA,MAAA,IAAU,MAAA,CAAO,aAAa,GAAG,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAEA,SAAS,cAAc,MAAA,EAA4B;AACjD,EAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AACtE,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AAChF,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC9B,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,GAAG,OAAO,KAAA;AAC5E,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,IAAI,OAAO,GAAA,CAAI,GAAG,CAAA,KAAM,QAAA,IAAY,OAAO,GAAA,CAAI,GAAG,CAAA,KAAM,QAAA,EAAU,OAAO,KAAA;AACzE,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,GAAG,CAAC,CAAA;AACpC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,MAAM,CAAA,8BAAA,EAAiC,GAAA,CAAI,GAAG,CAAC,CAAA,gBAAA,EAAmB,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC5F;AACA,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAIA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAc,KAAA,KAA4B;AAC/D,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AAChF,EAAA,OAAO,OAAO,WAAA,CAAY,MAAA,CAAO,KAAK,KAAK,CAAA,CAAE,MAAK,CAAE,GAAA,CAAI,CAAA,GAAA,KAAO,CAAC,KAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;AAChG,CAAA;AACO,SAAS,aAAA,CAAc,OAAgB,WAAA,EAA8B;AAC1E,EAAA,IAAI,WAAA,IAAe,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvF,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,IAAA,GAAO,IAAI,WAAW,CAAA;AAC5B,IAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAI,CAAA;AACjC,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,GAAG,aAAA,CAAc,KAAK,GAAG,CAAC,GAAG,GAAG,KAAA,CAAM,MAAA,EAAO,EAAE,EAAG,aAAa,CAAA;AAAA,IACtH;AAAA,EACF;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,aAAa,CAAA;AAC5C;AAKO,SAAS,aAAA,CAA2BA,OAAc,WAAA,EAAyB;AAChF,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAMA,KAAI,CAAA;AAC3B,EAAA,IAAI,WAAA,IAAe,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjF,IAAA,MAAM,MAAA,GAAS,GAAA;AACf,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,WAAW,CAAC,CAAA;AAChD,IAAA,IAAI,YAAY,MAAA,CAAO,WAAW,CAAA,EAAG,MAAA,CAAO,WAAW,CAAA,GAAI,OAAA;AAAA,EAC7D;AACA,EAAA,OAAO,GAAA;AACT;;;AC7CO,IAAM,YAAA,GAAe;AAC5B,IAAM,UAAA,GAAa,QAAA;AAGnB,IAAM,YAAA,GAAmD,EAAE,WAAA,EAAa,MAAA,EAAO;AAE/E,IAAM,aAAA,GAAgB,CAAC,GAAA,KAAsC,YAAA,CAAa,IAAI,IAAI,CAAA;AAE3E,SAAS,gBAAgB,IAAA,EAAwB;AACtD,EAAA,MAAM,MAAM,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAClD,EAAA,IAAI,CAAC,KAAK,MAAM,IAAI,aAAa,GAAA,EAAK,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AAC9D,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAe,SAAA,EAA6B;AACnE,EAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AACxD,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,CAAA,eAAA,EAAkB,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC/E,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AAC3C;AAEA,IAAM,QAAA,GAAW,CAAC,SAAA,EAAmB,IAAA,KAAyB,KAAK,QAAA,CAAS,SAAS,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAE9F,SAAS,QAAQ,GAAA,EAAyB;AACxC,EAAA,OAAO,GAAA,CAAI,QAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAC1C;AAEA,IAAM,aAAA,GAAgB,CAAC,GAAA,EAAe,GAAA,KAA0B,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA;AAElG,IAAM,eAAA,GAAkB,CAAC,GAAA,KAAwC,GAAA,CAAI,QAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA;AAErG,SAAS,QAAA,CAAS,KAAe,IAAA,EAAiC;AAChE,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,CAAE,IAAI,CAAA,IAAK,MAAA;AACzC;AAMA,SAAS,MAAA,CAAO,SAAgC,IAAA,EAAiC;AAC/E,EAAA,IAAI,OAAA,KAAY,UAAU,OAAO,EAAA;AACjC,EAAA,OAAO,IAAA,KAAS,SAAS,mBAAA,GAAsB,mBAAA;AACjD;AAIA,SAAS,YAAY,CAAA,EAAsB;AACzC,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,EAAW,OAAO,IAAA;AAC1C,EAAA,IAAI,OAAO,CAAA,KAAM,SAAA,EAAW,OAAO,IAAI,CAAA,GAAI,CAAA;AAC3C,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,UAAU,OAAO,CAAA;AAC3D,EAAA,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AACzB;AAEA,SAAS,YAAY,GAAA,EAAqC;AACxD,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KACd,OAAO,CAAA,KAAM,QAAA,IAAa,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AACtE,EAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,IAAK,EAAE,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,IAAI,MAAA,GAAS,CAAA,IAAK,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI;AAChF,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,gEAAgE,CAAA;AAAA,EAC9F;AACF;AAEA,SAAS,cAAc,KAAA,EAAmC;AACxD,EAAA,IAAI,UAAU,MAAA,EAAW;AACzB,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,yBAAyB,CAAA;AAAA,EACvD;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AACxD,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,WAAA,CAAY,GAAG,CAAA;AAAA,EACxC;AACA,EAAA,KAAA,MAAW,QAAQ,CAAC,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AACrD,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,OAAO,IAAA,KAAS,SAAA,EAAW;AACnD,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,kCAAkC,CAAA;AAAA,IAChE;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,GAAA,EAAuB;AACtC,EAAA,WAAA,CAAY,GAAG,CAAA;AACf,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,CAAC,GAAG,CAAA;AACxC;AAKA,SAAS,SAAA,CAAU,OAAgB,MAAA,EAAuC;AACxE,EAAA,IAAI,GAAA,GAAe,KAAA;AACnB,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACpC,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,MAAA;AAEpD,IAAA,MAAM,GAAA,GAAM,GAAA;AACZ,IAAA,GAAA,GAAM,IAAI,IAAI,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,MAAA;AACpC;AAIA,SAAS,UAAA,CAAW,KAAe,KAAA,EAAwB;AACzD,EAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,KAAA,EAAO,CAAC,CAAC,CAAA;AAC7D,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,IAAI,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AACvC,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,CAAA,cAAA,EAAiB,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,aAAA,EAAgB,GAAA,CAAI,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC7F;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,OAAO,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AACrC;AAMA,SAAS,UAAA,CAAW,IAAA,EAAgB,KAAA,EAA6B,MAAA,EAAmC;AAClG,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AACvC,IAAA,MAAMC,QAAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAC1B,MAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,KAAA,CAAA;AAAA,IACpB,CAAC,CAAA;AACD,IAAA,OAAO,CAAA,OAAA,EAAUA,QAAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,SAAoC,EAAC;AAC3C,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,UAAU,IAAA,EAAM;AACrD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,OAAA,CAAQ,KAAA,CAAM,KAAK,GAAG,KAAA,CAAM,SAAA,GAAY,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,UAAU,IAAA,EAAM;AACrD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,OAAA,CAAQ,KAAA,CAAM,KAAK,GAAG,KAAA,CAAM,SAAA,GAAY,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,EAAE,CAAA,IAAK,MAAA,EAAQ;AAChC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AACvC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACjC,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,EAAA,EAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AAAA,IACrC,CAAA,MAAO;AAEL,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC9B,QAAA,MAAM,MAAgB,EAAC;AACvB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,UAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,QAC7B;AACA,QAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAC1B,QAAA,MAAM,QAAQ,CAAA,KAAM,KAAA,CAAM,SAAS,CAAA,GAAI,EAAA,GAAK,GAAG,CAAC,CAAA;AAChD,QAAA,GAAA,CAAI,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,CAAI,CAAA;AAClC,QAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,MAC9B,CAAC,CAAA;AACD,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACtC;AAAA,EACF;AACA,EAAA,OAAO,QAAQ,MAAA,GAAS,CAAA,OAAA,EAAU,QAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC9D;AAEA,SAAS,WAAW,KAAA,EAA+C;AACjE,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAChC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACxD,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,kBAAkB,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACtC;AAEA,IAAM,WAAA,GAAc,CAAC,KAAA,KACnB,KAAA,KAAU,SAAY,EAAA,GAAK,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA;AAExD,SAAS,SAAA,CAAU,MAAgB,WAAA,EAAiC;AAClE,EAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,cAAc,CAAA,CAAE,IAAA,EAAgB,WAAW,CAAC,CAAA;AACrE;AAMA,eAAe,QAAA,CACb,IAAA,EACA,GAAA,EACA,GAAA,EACA,OACA,KAAA,EACoB;AACpB,EAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAM,CAAA,oBAAA,EAAuB,GAAA,CAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAChE,EAAA,MAAM,QAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,QAAQ,aAAA,CAAc,GAAA,CAAI,IAAA,EAAgB,aAAA,CAAc,GAAG,CAAC,CAAA;AAClE,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,KAAA,EAAO,CAAC,CAAC,CAAA;AAC7D,MAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAmB,CAAA,KAAM,MAAS,CAAA,EAAG;AACvD,MAAA,MAAM,MAAM,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAC5C,MAAA,IAAI,KAAA,IAAS,CAAC,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA,EAAG;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AACjC,MAAA,IAAI,KAAA,IAAS,CAAC,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA,EAAG;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAClC,EAAA,OAAO,UAAU,MAAA,GAAY,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,GAAG,KAAK,CAAA;AACvD;AAEA,eAAsB,MAAA,CAAO,IAAA,EAAqB,GAAA,EAAe,GAAA,EAA2C;AAC1G,EAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ;AACvC,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,CAAA,UAAA,EAAa,KAAA,CAAM,MAAM,CAAA,kBAAA,EAAqB,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EAChH;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA;AAAA,IACtB,CAAA,oBAAA,EAAuB,GAAA,CAAI,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA;AAAA,IAC9C,KAAA,CAAM,IAAI,WAAW;AAAA,GACvB;AACA,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,GAAI,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAgB,aAAA,CAAc,GAAG,CAAC,CAAA,GAAI,MAAA;AAC/E;AAEA,eAAsB,OAAA,CAAQ,IAAA,EAAqB,GAAA,EAAe,IAAA,EAAkD;AAClH,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AAEvC,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA,EAAG;AACnC,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,MAAA,IAAI,KAAA,CAAM,WAAW,GAAA,CAAI,OAAA,CAAQ,QAAQ,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,4BAA4B,CAAA;AACjG,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,GAAA,CAAI,WAAW,CAAC,CAAA;AACrC,MAAA,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,IAClE,CAAC,CAAA;AACD,IAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,CAAK,KAAA,CAAM,uBAAuB,GAAA,CAAI,IAAI,CAAA,QAAA,EAAW,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG;AAC/G,MAAA,MAAM,KAAA,GAAQ,cAAc,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG,aAAA,CAAc,GAAG,CAAC,CAAA;AAChE,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,UAAA,CAAW,KAAK,KAAK,CAAC,GAAG,KAAK,CAAA;AAAA,IACzD;AAAA,EACF;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO,KAAA,CAAM,IAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAC,CAAA;AACvD;AAEA,eAAsB,qBAAA,CAAsB,IAAA,EAAqB,GAAA,EAAe,SAAA,EAAmB,IAAA,EAAsC;AACvI,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,GAAA,EAAK,SAAS,CAAA;AAC1C,EAAA,IAAI,IAAI,UAAA,EAAY;AAClB,IAAA,MAAM,MAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,MAAM,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,EAAE,IAAA,EAAM,GAAA,EAAI,EAAG,MAAA,EAAW,SAAS,CAAC,CAAA;AAC/F,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAuB;AAEzC,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA,EAAG;AACnC,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,MAAA,IAAI,KAAA,CAAM,WAAW,GAAA,CAAI,OAAA,CAAQ,QAAQ,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,yBAAyB,CAAA;AAC9F,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,GAAA,CAAI,WAAW,CAAC,CAAA;AACrC,MAAA,OAAO,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,CAAC,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,IAChF,CAAC,CAAA;AACD,IAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAA,CAAI,IAAI,CAAA,QAAA,EAAW,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,UAAA,EAAa,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG;AAC1K,MAAA,MAAM,KAAA,GAAQ,cAAc,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG,aAAA,CAAc,GAAG,CAAC,CAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,GAAA,CAAI,UAAQ,cAAA,CAAe,KAAA,EAAO,IAAI,CAAC,CAAA;AACjE,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAK,CAAA;AAChE,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC5B,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,WAAQ,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,CAAC,KAAK,CAAC,CAAA;AAAA,IAC7D;AAAA,EACF;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,IAAK,EAAE,CAAA;AAC7D;AAEA,eAAsB,QAAA,CACpB,IAAA,EACA,GAAA,EACA,KAAA,EACA,OACA,SAAA,EACoB;AACpB,EAAA,aAAA,CAAc,KAAK,CAAA;AACnB,EAAA,MAAM,GAAA,GAAM,SAAA,GAAY,eAAA,CAAgB,GAAA,EAAK,SAAS,CAAA,GAAI,MAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,cAAc,GAAG,CAAA;AACrC,EAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,IAAA,MAAM,OAAO,KAAA,EAAO,IAAA;AACpB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,OAAO,IAAA,KAAS,QAAA,EAAU;AAClD,MAAA,MAAM,IAAI,aAAa,GAAA,EAAK,CAAA,kBAAA,EAAqB,IAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAC3G;AACA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,GAAA,EAAM,CAAC,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,OAAO,CAAA;AAE1E,IAAA,MAAMC,SAAQ,CAAC,OAAA,EAAS,GAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,MAAM,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AACzE,IAAA,MAAMC,KAAAA,GAAO,MAAM,IAAA,CAAK,KAAA;AAAA,MACtB,CAAA,gCAAA,EAAmC,GAAA,CAAI,IAAI,CAAA,UAAA,EAAa,cAAc,GAAA,EAAK,GAAG,CAAC,CAAA,OAAA,EAAU,MAAM,CAAA,0BAAA,EAChED,MAAK,CAAA,EAAG,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA;AAAA,MACzD,CAAC,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC;AAAA,KACvB;AACA,IAAA,OAAO,SAAA,CAAUC,OAAM,WAAW,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG,IAAA,KAAS,QAAA,CAAS,IAAI,IAAA,EAAM,IAAI,CAAC,CAAA,GAAI,QAAQ,GAAG,CAAA;AACvF,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC5C,EAAA,IAAI,KAAA,KAAU,IAAA,EAAM,OAAO,QAAA,CAAS,IAAA,EAAM,KAAK,GAAA,EAAK,KAAA,EAAO,UAAA,CAAW,KAAK,CAAC,CAAA;AAI5E,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,aAAA,CAAe,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AAClE,EAAA,MAAM,IAAA,GAAO,QAAQ,CAAA,EAAG,KAAK,QAAQ,OAAO,CAAA,CAAA,GAAK,UAAU,OAAO,CAAA,CAAA;AAElE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC7D,EAAA,MAAM,QAAQ,CAAA,UAAA,EAAa,CAAC,GAAG,IAAA,EAAM,GAAG,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACjF,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA;AAAA,IACtB,CAAA,oBAAA,EAAuB,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,IAAI,GAAG,KAAK,CAAA,EAAG,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA;AAAA,IACpE;AAAA,GACF;AACA,EAAA,OAAO,SAAA,CAAU,MAAM,WAAW,CAAA;AACpC;AAEA,eAAsB,SAAA,CACpB,IAAA,EACA,GAAA,EACA,KAAA,EACA,SAAA,EACiB;AACjB,EAAA,aAAA,CAAc,KAAK,CAAA;AACnB,EAAA,MAAM,GAAA,GAAM,SAAA,GAAY,eAAA,CAAgB,GAAA,EAAK,SAAS,CAAA,GAAI,MAAA;AAC1D,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,MAAM,OAAO,KAAA,EAAO,IAAA;AACpB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,OAAO,IAAA,KAAS,QAAA,EAAU;AAClD,MAAA,MAAM,IAAI,aAAa,GAAA,EAAK,CAAA,kBAAA,EAAqB,IAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAC3G;AACA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,GAAA,EAAM,CAAC,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,OAAO,CAAA;AAC1E,IAAA,MAAMA,KAAAA,GAAO,MAAM,IAAA,CAAK,KAAA;AAAA,MACtB,CAAA,6BAAA,EAAgC,IAAI,IAAI,CAAA,UAAA,EAAa,cAAc,GAAA,EAAK,GAAG,CAAC,CAAA,OAAA,EAAU,MAAM,CAAA,gBAAA,CAAA;AAAA,MAC5F,CAAC,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC;AAAA,KACvB;AACA,IAAA,OAAO,MAAA,CAAOA,KAAAA,CAAK,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG,IAAA,KAAS,QAAA,CAAS,IAAI,IAAA,EAAM,IAAI,CAAC,CAAA,GAAI,QAAQ,GAAG,CAAA;AACvF,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC5C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,MAAM,MAAM,QAAA,CAAS,MAAM,GAAA,EAAK,GAAA,EAAK,OAAO,MAAS,CAAA;AAC3D,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,GAAO,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,eAAe,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,aAAA,CAAe,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAM,KAAA;AACvK,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,6BAAA,EAAgC,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA;AACxF,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA;AAC/B;AAIA,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,OAAA,GAAU,GAAA;AAEhB,IAAM,MAAA,GAAS,CAAI,GAAA,EAAU,IAAA,KAAwB;AACnD,EAAA,MAAM,MAAa,EAAC;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAC1E,EAAA,OAAO,GAAA;AACT,CAAA;AAKA,eAAsB,WAAA,CACpB,IAAA,EACA,KAAA,EACA,IAAA,EACA,MACA,UAAA,EACe;AACf,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA;AACjF,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA,CAAE,IAAI,CAAA,IAAA,MAAS;AAAA,IAChD,GAAA,EAAK,CAAA,aAAA,EAAgB,KAAK,CAAA,GAAA,EAAM,OAAO,CAAA,SAAA,EAAY,IAAA,CAAK,GAAA,CAAI,MAAM,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,IAAI,UAAU,CAAA,CAAA;AAAA,IACjG,MAAA,EAAQ,KAAK,IAAA;AAAK,GACpB,CAAE,CAAA;AACF,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,MAAM,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,OACtC,KAAA,MAAW,aAAa,UAAA,EAAY,MAAM,KAAK,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,SAAA,CAAU,MAAM,CAAA;AAC1F;AAGA,eAAsB,QAAA,CAAS,IAAA,EAAqB,KAAA,EAAe,GAAA,EAAa,IAAA,EAAiC;AAC/G,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA,EAAG;AACpC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAK,CAAA,SAAA,EAAY,GAAG,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,IAAI,CAAA;AAAA,EACtG;AACF;AAEA,eAAsB,OAAA,CAAQ,IAAA,EAAqB,GAAA,EAAe,MAAA,EAAmB,WAAA,EAA2C;AAC9H,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AACjC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,kBAAA,CAAmB,GAAA,CAAI,MAAM,KAAK,CAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,OAAA,EAAS;AAC7B,IAAA,IAAI,IAAI,UAAA,EAAY;AACpB,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,IAAI,CAAC,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAChB,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,CAAC,MAAM,CAAC,MAAA,CAAO,IAAI,CAAC,CAAC,EAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,iBAAiB,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACnG,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE9C,EAAA,MAAM,OAAqB,EAAC;AAC5B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,gBAAgB,GAAG,CAAA;AACjC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAI,WAAW,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,QAAQ,CAAA;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,IAAI,OAAA,EAAS;AAC7B,MAAA,IAAI,IAAI,UAAA,EAAY;AACpB,MAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA,IAAK,IAAI,CAAC,CAAC,CAAA;AAAA,IAC3F;AACA,IAAA,IAAA,CAAK,KAAK,aAAA,CAAc,KAAA,EAAO,aAAA,CAAc,GAAG,CAAC,CAAC,CAAA;AAClD,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,QAAQ,SAAA,CAAU,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC/C,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,QAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,CAAC,GAAG,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA;AACjF,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA,CAAE,IAAI,CAAA,IAAA,MAAS;AAAA,IAChD,GAAA,EAAK,gBAAgB,GAAA,CAAI,IAAI,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,MAAM,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,OAChH,GAAA,CAAI,IAAA,KAAS,oBAAoB,CAAA,aAAA,EAAgB,EAAE,iBAAiB,CAAA,aAAA,EAAgB,EAAE,CAAA,gBAAA,EAAmB,OAAO,CAAA,QAAA,EAAW,GAAA,CAAI,IAAI,CAAA,2BAAA,CAAA,CAAA,GACpI,CAAA,WAAA,EAAc,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACxD,MAAA,EAAQ,KAAK,IAAA;AAAK,GACpB,CAAE,CAAA;AACF,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAI,KAAK,KAAA,EAAO,QAAA,GAAW,MAAM,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,SACjD;AACH,MAAA,QAAA,GAAW,EAAC;AACZ,MAAA,KAAA,MAAW,SAAA,IAAa,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,GAAA,EAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,IACrG;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,mBAAA,EAAqB,sBAAA,EAAwB,qBAAqB,CAAA,EAAG;AACvF,MAAA,IAAI,OAAA,CAAQ,SAAS,IAAI,CAAA,QAAS,IAAI,YAAA,CAAa,GAAA,EAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,EAAK,CAAE,IAAI,CAAA,GAAA,KAAO;AACzC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AACtC,IAAA,OAAO,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAAA,EACzC,CAAC,CAAA;AACD,EAAA,WAAA,EAAa,IAAA,CAAK,GAAG,OAAO,CAAA;AAC5B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,GAAA,EAAK,KAAK,CAAA;AACnC,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,SAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAC,CAAA;AAClE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,CAAA,KAAA,KAAS;AACtC,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AACjC,MAAA,IAAI,CAAC,WAAW,GAAA,CAAI,IAAA,CAAK,UAAU,GAAG,CAAC,CAAA,EAAG,OAAO,EAAC;AAClD,MAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAC,CAAC,KAAK,EAAC;AACrD,MAAA,OAAO,CAAC;AAAA,QAAE,GAAA,EAAK,CAAA,aAAA,EAAgB,EAAE,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,IACpF,KAAA,CAAM,MAAA,GAAS,CAAA,iBAAA,EAAoB,KAAA,CAAM,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA;AAAA,QAC3E,QAAQ,CAAC,GAAG,OAAA,CAAQ,GAAG,EAAE,GAAA,CAAI,WAAW,CAAA,EAAG,GAAG,MAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC;AAAA,OAAG,CAAA;AAAA,IAC5F,CAAC,CAAA;AACD,IAAA,IAAI,KAAK,KAAA,IAAS,OAAA,CAAQ,QAAQ,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,SACrD,KAAA,MAAW,aAAa,OAAA,EAAS,MAAM,KAAK,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,SAAA,CAAU,MAAM,CAAA;AACrF,IAAA,MAAM,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,CAAC,GAAG,IAAA,EAAM,GAAG,CAAA,EAAG,QAAA,CAAS,MAAA,CAAO,CAAA,GAAA,KAAO,UAAA,CAAW,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAA;AAAA,EACtL;AACA,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,MAAA,CAAO,IAAA,EAAqB,GAAA,EAAe,KAAA,EAAiC;AAChG,EAAA,OAAA,CAAQ,MAAM,QAAQ,IAAA,EAAM,GAAA,EAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAC9C;AAEA,eAAsB,UAAA,CAAW,IAAA,EAAqB,GAAA,EAAe,UAAA,EAA8C;AACjH,EAAA,IAAI,GAAA,CAAI,SAAS,iBAAA,EAAmB,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,sDAAsD,mBAAmB,CAAA;AACzI,EAAA,MAAM,KAAA,GAAQ,gBAAgB,GAAG,CAAA;AACjC,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAU,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAQ,QAAQ,UAAU,CAAA;AAChC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ;AACrC,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,CAAA,UAAA,EAAa,KAAA,CAAM,MAAM,CAAA,iBAAA,EAAoB,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IAC/G;AACA,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,EAAQ,GAAA,CAAI,QAAQ,MAAM,CAAA;AACnD,IAAA,MAAM,OAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,KAAK,OAAO,CAAA;AAC3E,IAAA,MAAMC,UAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAI,WAAW,CAAA;AAChD,IAAA,IAAI,KAAA,EAAO,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,aAAA,CAAc,GAAA,EAAK,KAAK,CAAC,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,EAAIA,OAAM,CAAA;AAC7F,IAAA,MAAM,IAAA,CAAK,KAAK,CAAA,aAAA,EAAgB,GAAA,CAAI,IAAI,CAAA,QAAA,EAAW,IAAI,IAAIA,OAAM,CAAA;AACjE,IAAA;AAAA,EACF;AACA,EAAA,aAAA,CAAc,UAAU,CAAA;AACxB,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,MAAM,CAAA;AACjD,EAAA,IAAI,UAAU,IAAA,EAAM;AAElB,IAAA,KAAA,MAAW,OAAO,MAAM,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,UAAU,CAAA,EAAG;AACvD,MAAA,MAAM,WAAW,IAAA,EAAM,GAAA,EAAK,UAAA,CAAW,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,IAClD;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACnD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,CAAA,aAAA,EAAgB,aAAA,CAAc,GAAA,EAAK,KAAK,CAAC,CAAA,SAAA,EAAY,OAAO,CAAA,aAAA,EAAgB,OAAO,CAAA,OAAA,EAAU,GAAA,CAAI,IAAI,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MAC9G;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,IAAA,CAAK,KAAK,CAAA,aAAA,EAAgB,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,MAAM,CAAA;AAC7D;AAEA,eAAsB,SAAA,CAAU,IAAA,EAAqB,GAAA,EAAe,IAAA,GAAO,KAAA,EAAsB;AAC/F,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,iBAAA,IAAqB,CAAC,IAAA,QAAY,IAAI,YAAA,CAAa,GAAA,EAAK,oDAAA,EAAsD,mBAAmB,CAAA;AAClJ,EAAA,MAAM,KAAA,GAAQ,gBAAgB,GAAG,CAAA;AACjC,EAAA,IAAI,KAAA,QAAa,IAAA,CAAK,IAAA,CAAK,gBAAgB,aAAA,CAAc,GAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,GAAA,CAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAC7C;AAIA,eAAsB,SAAS,IAAA,EAAoC;AACjE,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,QAAc,SAAA,CAAU,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,EAClD;AACF;AAEA,SAAS,aAAa,OAAA,EAAwC;AAC5D,EAAA,OAAO,OAAA,KAAY,WACf,CAAA,yDAAA,CAAA,GACA,CAAA,8FAAA,CAAA;AACN;AAGA,eAAe,iBAAA,CACb,IAAA,EACA,OAAA,EACA,GAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,EAAA,MAAM,OAAgC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,EAAG,MAAA,CAAO,OAAA,EAAS,QAAA,CAAS,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5G,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,OAAA,EAAS;AAC7B,IAAA,IAAI,IAAI,UAAA,EAAY;AACpB,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,IAAA,EAAM,IAAA,KAAS;AAClC,MAAA,IAAA,CAAK,IAAA,CAAK,CAAC,QAAA,CAAS,GAAA,CAAI,MAAM,IAAI,CAAA,EAAG,MAAA,CAAO,OAAA,EAAS,QAAA,CAAS,GAAA,EAAK,IAAI,CAAC,CAAC,CAAC,CAAA;AAAA,IAC5E,CAAC,CAAA;AAAA,EACH;AACA,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AACjD,EAAA,MAAM,IAAA,CAAK,IAAA;AAAA,IACT,+BAA+B,GAAA,CAAI,IAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,eAAA,EAAkB,KAAK,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,GACvH;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,OAAA,EAAS;AAC7B,IAAA,IAAI,IAAI,UAAA,EAAY;AACpB,IAAA,MAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,IAAA,KAAS,CAAA,CAAA,EAAI,QAAA,CAAS,GAAA,CAAI,MAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACrF,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,UAAU,GAAA,CAAI,MAAA,GAAS,SAAA,GAAY,EAAE,wBAAwB,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,QAAA,CAAS,IAAI,IAAI,CAAC,SAAS,GAAA,CAAI,IAAI,MAAM,KAAK,CAAA,CAAA;AAAA,KAC1H;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,GAAG,CAAA;AACjC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,GAAA,EAAK,KAAK,CAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,EAAI,OAAO,OAAA,EAAS,QAAA,CAAS,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAE1F,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,CAAA,4BAAA,EAA+B,EAAE,CAAA,GAAA,EAAM,KAAA,CAAM,KAAK,IAAI,CAAC,QAAQ,MAAA,CAAO,OAAA,EAAS,MAAM,CAAC,CAAA,eAAA,EAAkB,CAAC,GAAG,IAAA,EAAM,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,KACrI;AACA,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA,4BAAA,EAA+B,EAAE,CAAA,SAAA,EAAY,EAAE,CAAA,OAAA,CAAS,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,OAAA,IAAW,OAAA,KAAY,QAAA,EAAU;AAChD,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wFAAA,CAKqE,CAAA;AAAA,EACvF;AACA,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,iBAAA,IAAqB,OAAA,KAAY,QAAA,EAAU;AAC1D,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAAA;AAAA,6FAAA,CAE0E,CAAA;AAAA,EAC5F;AACA,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,UAAA,IAAc,OAAA,KAAY,QAAA,EAAU;AACnD,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA,qFAAA,CAIkE,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,OAAA,KAAY,UAAA,IAAc,CAAC,OAAA,EAAS,iBAAA,EAAmB,UAAU,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACzF,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,KAAS,iBAAA,GAC3B,wJACA,GAAA,CAAI,IAAA,KAAS,UACX,CAAA,wWAAA,CAAA,GACA,CAAA,8OAAA,CAAA;AACN,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,KAAS,iBAAA,GAAoB,sBAAsB,GAAA,CAAI,IAAA,KAAS,UAAU,sBAAA,GAAyB,qBAAA;AACpH,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,MAAA,CAAA;AACzB,IAAA,MAAM,IAAA,CAAK,KAAK,CAAA,4BAAA,EAA+B,KAAK,uDAAuD,SAAS,CAAA,uBAAA,EAA0B,IAAI,CAAA,8BAAA,CAAgC,CAAA;AAClL,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA,wBAAA,EAA2B,KAAK,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AACpE,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,YAAY,GAAA,CAAI,IAAA,KAAS,iBAAA,GAAoB,QAAA,GAAW,QAAQ,CAAA,KAAA,EAAQ,GAAA,CAAI,IAAI,CAAA,iCAAA,EAAoC,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,EACxK;AACF;AAaA,eAAsB,gBAAgB,EAAA,EAA6B;AACjE,EAAA,MAAM,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AACjC,IAAA,MAAM,EAAA,CAAG,IAAA;AAAA,MACP,+BAA+B,YAAY,CAAA,iDAAA;AAAA,KAC7C;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KACf,IAAA,CAAK,WAAW,WAAW,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC3D,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAY,UAAA,CAAW,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACjE,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,MAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAClD,MAAA,IAAI,OAAO,WAAA,CAAY,GAAA,CAAI,aAAA,CAAc,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,MAAM,aAAa,IAAI,GAAA;AAAA,MAAA,CACpB,MAAM,EAAA,CAAG,KAAA,CAAM,YAAA,CAAa,EAAA,CAAG,OAAO,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,CAAC,CAAC;AAAA,KAC9G;AACA,IAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,KAAA,CAAM,wBAAwB,YAAY,CAAA,iBAAA,CAAA,EAAqB,CAAC,UAAU,CAAC,CAAA;AACtG,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG;AAChB,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACnD,MAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,CAAC,MAAA,CAAO,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA,IAAK,KAAA,CAAM,OAAA,GAAU,CAAA,EAAG;AAClG,QAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,CAAA,QAAA,EAAW,YAAY,cAAc,kBAAkB,CAAA;AAAA,MACrF;AACA,MAAA,MAAA,GAAS,KAAA,CAAM,OAAA;AACf,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,GAAA;AAAA,UACA,CAAA,iBAAA,EAAoB,MAAM,CAAA,sCAAA,EAAyC,UAAU,CAAA,wBAAA,CAAA;AAAA,UAC7E;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,MAAM,OAAA,GAAU,CAAC,GAAG,WAAW,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,UAAA,CAAW,GAAA,CAAI,IAAI,CAAC,CAAA;AACvE,QAAA,MAAM,UAAA,GAAa,CAAC,GAAG,UAAU,EAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,KAAS,YAAA,IAAgB,CAAC,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AACnG,QAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/C,UAAA,MAAM,IAAI,YAAA;AAAA,YACR,GAAA;AAAA,YACA,CAAA,iBAAA,EAAoB,MAAM,CAAA,uBAAA,EAA0B,UAAU,qBAAqB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IAAK,MAAM,CAAA,uBAAA,EAA0B,UAAA,CAAW,IAAA,CAAK,IAAI,KAAK,MAAM,CAAA,8DAAA,CAAA;AAAA,YACxK;AAAA,WACF;AAAA,QACF;AAAA,MAGF;AAAA,IACF,CAAA,MAAA,IAAW,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA,EAAG;AAChE,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,GAAA;AAAA,QACA,6JAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY,MAAM,kBAAkB,EAAA,EAAI,EAAA,CAAG,SAAS,GAAG,CAAA;AACzE,IAAA,IAAI,WAAW,UAAA,EAAY;AACzB,MAAA,MAAM,EAAA,CAAG,IAAA;AAAA,QACP,gBAAgB,YAAY,CAAA,6FAAA,CAAA;AAAA,QAC5B,CAAC,YAAY,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,UAAA,EAAY,CAAC;AAAA,OACtD;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;ACtqBA,IAAM,MAAA,GAAS,CAAC,aAAA,EAAe,aAAa,CAAA;AAE5C,IAAM,oBAAA,GAAuB,mBAAA;AAI7B,SAAS,WAAW,GAAA,EAA0C;AAC5D,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,QAAQ,YAAA,EAAc,aAAA,EAAe,YAAA,EAAc,SAAS,CAAA,EAAY;AACrH,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,SAAA,IAClC,KAAA,IAAS,MAAM,MAAM,IAAI,aAAa,GAAA,EAAK,CAAA,EAAG,GAAG,CAAA,iBAAA,CAAmB,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,IAAA;AACT;AAIA,IAAM,GAAA,GAAM,CAAC,CAAA,KAA+B,OAAO,CAAA,KAAM,YAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAC9F,IAAM,OAAO,CAAC,CAAA,KAA+B,OAAO,CAAA,KAAM,WAAW,CAAA,GAAI,IAAA;AACzE,IAAM,CAAA,GAAI,CAAC,CAAA,KAA0B,IAAA,CAAK,CAAC,CAAA,IAAkB,IAAA;AAC7D,IAAM,CAAA,GAAI,CAAC,CAAA,KAAyB,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAI9C,SAAS,UAAU,EAAA,EAA6B;AAC9C,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,OAAA,KAAY,UAAA,GAAa,mBAAA,GAAsB,EAAA;AAC5D,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,OAAA,KAAY,UAAA,GAAa,mBAAA,GAAsB,OAAA;AAC5D,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,CAAA,mDAAA,EAAsD,CAAC,CAAA,kCAAA,EAAqC,CAAC,cAAc,CAAC,CAAA,aAAA,EAAgB,CAAC,CAAA,eAAA,EAAkB,CAAC,CAAA,SAAA,EAAY,CAAC,CAAA,yBAAA,EAA4B,CAAC,CAAA,uBAAA,EAA0B,CAAC,CAAA,iBAAA,EAAoB,CAAC,kBAAkB,CAAC,CAAA,oBAAA,EAAuB,CAAC,CAAA,oBAAA,EAAuB,CAAC,CAAA,UAAA,CAAA;AAAA,IAC7S,CAAA,sFAAA,CAAA;AAAA,IACA,CAAA,+FAAA,CAAA;AAAA,IACA,CAAA,yFAAA,CAAA;AAAA,IACA,CAAA,yDAAA,EAA4D,CAAC,CAAA,uCAAA,EAA0C,CAAC,CAAA,kBAAA,EAAqB,CAAC,CAAA,cAAA,EAAiB,CAAC,CAAA,eAAA,EAAkB,CAAC,CAAA,WAAA,EAAc,CAAC,gBAAgB,CAAC,CAAA,aAAA,EAAgB,CAAC,CAAA,eAAA,EAAkB,CAAC,CAAA,WAAA,EAAc,CAAC,CAAA,kBAAA,EAAqB,CAAC,CAAA,uBAAA,EAA0B,CAAC,CAAA,uBAAA,EAA0B,CAAC,CAAA,mBAAA,EAAsB,CAAC,CAAA,oBAAA,EAAuB,CAAC,uBAAuB,CAAC,CAAA,UAAA,CAAA;AAAA,IACzY,CAAA,mHAAA,CAAA;AAAA,IACA,CAAA,kGAAA,CAAA;AAAA,IACA,CAAA,oFAAA,CAAA;AAAA,IACA,CAAA,yFAAA,CAAA;AAAA,IACA,CAAA,4FAAA;AAAA,GACF;AACA,EAAA,OAAO,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AAClC,IAAA,KAAA,MAAW,GAAA,IAAO,GAAA,EAAK,MAAM,EAAA,CAAG,KAAK,GAAG,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAGA,IAAM,gBAAA,GAAmB,CAAC,SAAA,EAAU,WAAA,EAAY,SAAA,EAAU,WAAA,EAAY,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,YAAA,EAAa,MAAA,EAAO,aAAA,EAAc,WAAU,SAAS,CAAA;AAChK,IAAM,mBAAmB,CAAC,eAAA,EAAgB,gBAAA,EAAiB,gBAAA,EAAiB,cAAa,aAAA,EAAc,SAAA,EAAU,WAAA,EAAY,WAAA,EAAY,eAAc,SAAA,EAAU,gBAAA,EAAiB,cAAa,YAAA,EAAa,iBAAA,EAAkB,WAAU,SAAS,CAAA;AAEjP,IAAM,cAAA,GAAiB,CAAC,IAAA,EAAyB,IAAA,KAC/C,CAAA,aAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,gBAAA,CAAA,GACpD,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA,cAAA,EAAiB,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GACrF,CAAA,OAAA,CAAA,GAAY,IAAA,CAAK,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,GAAG,CAAA,6BAAA,EAAgC,GAAG,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAI3H,SAAS,cAAc,IAAA,EAAuD;AAC5E,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AACvB,EAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAChB,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IACX,CAAA,CAAE,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,IACvB,CAAA,CAAE,KAAK,QAAQ,CAAA;AAAA,IACf,CAAA,CAAE,KAAK,UAAU,CAAA;AAAA,IACjB,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,IAAK,EAAA;AAAA,IAAA,CAChB,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,IAAK,IAAI,WAAA,EAAY;AAAA,IACrC,CAAA,CAAE,KAAK,SAAS,CAAA;AAAA,IAChB,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IAAA,CACZ,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,IAAK,IAAI,WAAA,EAAY;AAAA,IAC1C,aAAA,CAAc,MAAA,EAAQ,SAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,IACvC,cAAc,IAAI;AAAA,GACpB;AACF;AAEA,eAAe,iBAAA,CAAkB,MAAqB,KAAA,EAAiD;AACrG,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,aAAa,EAAE,MAAA,CAAO,CAAC,CAAA,KAAuB,CAAA,KAAM,MAAS,CAAA;AACpF,EAAA,MAAM,WAAA,CAAY,IAAA,EAAM,aAAA,EAAe,CAAC,GAAG,gBAAgB,CAAA,EAAG,IAAA,EAAM,cAAA,CAAe,gBAAA,EAAkB,CAAC,SAAS,CAAC,CAAC,CAAA;AACnH;AAIA,SAAS,aAAA,CAAc,OAAgC,MAAA,EAA0D;AAC/G,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AACxB,EAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAChB,EAAA,MAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,MAAA,GAAU,MAAA,CAAO,IAAA,IAAQ,OAAO,UAAA,GAAc,SAAA;AAChE,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,CAAA,CAAE,MAAM,MAAM,CAAA;AAAA,IACd,QAAQ,OAAA,IAAW,IAAA;AAAA,IACnB,CAAA,CAAE,MAAM,cAAc,CAAA;AAAA,IACtB,CAAA,CAAE,MAAM,OAAO,CAAA;AAAA,IACf,GAAA,CAAI,MAAM,QAAQ,CAAA;AAAA,IAClB,CAAA,CAAE,MAAM,QAAQ,CAAA;AAAA,IAChB,CAAA,CAAE,MAAM,QAAQ,CAAA;AAAA,IAChB,CAAA,CAAE,MAAM,UAAU,CAAA;AAAA,IAClB,CAAA,CAAE,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,IACvB,SAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA,EAAQ,IAAA,CAAK,KAAA,IAAS,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,IAAA,CACtC,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,IAAK,IAAI,WAAA,EAAY;AAAA,IAC3C,aAAA,CAAc,MAAA,EAAQ,SAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,IACvC,aAAA,CAAc,MAAA,GAAS,EAAE,GAAG,KAAA,EAAO,WAAW,MAAA,CAAO,IAAA,CAAK,KAAA,EAAM,GAAI,KAAK;AAAA,GAC3E;AACF;AAEA,eAAe,iBAAA,CAAkB,MAAqB,MAAA,EAA8E;AAClI,EAAA,MAAM,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,OAAO,CAAC,CAAA,KAAuB,MAAM,MAAS,CAAA;AACvG,EAAA,MAAM,WAAA,CAAY,IAAA,EAAM,aAAA,EAAe,CAAC,GAAG,gBAAgB,CAAA,EAAG,IAAA,EAAM,cAAA,CAAe,gBAAA,EAAkB,CAAC,eAAe,CAAC,CAAC,CAAA;AACzH;AAMA,SAAS,oBAAoB,KAAA,EAAuD;AAClF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AACvB,IAAA,IAAI,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,EAAE,OAAA,EAAS,IAAI,IAAA,EAAM,GAAA,CAAI,KAAK,IAAI,CAAA,EAAG,YAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,IAAK,CAAA,EAAG,MAA+B,CAAA;AAAA,EACrI;AACA,EAAA,OAAO,EAAE,QAAA,EAAS;AACpB;AAEA,SAAS,iBAAA,CAAkB,OAAoB,KAAA,EAA0D;AACvG,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,MAAM,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA;AACrF,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,QAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,GAAI,MAAA;AACxF,EAAA,OAAO,UAAU,MAAA,IAAU,KAAA,CAAM,OAAO,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,EAAE,CAAA,CAAA,IACjE,KAAA,CAAM,iBAAiB,MAAA,CAAO,OAAA,IAAW,MAAM,QAAA,KAAa,MAAA,CAAO,QACnE,KAAA,CAAM,cAAA,KAAmB,OAAO,IAAA,CAAK,cAAA,IAAkB,MAAM,IAAA,KAAS,MAAA,CAAO,QAAQ,KAAA,CAAM,EAAA,KAAO,OAAO,EAAA,IACzG,KAAA,CAAM,eAAe,MAAA,CAAO,IAAA,CAAK,WAAW,KAAA,CAAM,MAAA,CAAO,MAAM,MAAA,CAAO,EAAE,IAAI,MAAA,GAAS,MAAA;AAC5F;AAEA,eAAe,gBAAA,CAAiB,MAAqB,OAAA,EAAyC;AAC5F,EAAA,MAAM,QAAQ,MAAM,OAAA,CAAQ,MAAM,eAAA,CAAgB,OAAO,GAAG,OAAO,CAAA;AACnE,EAAA,OAAO,oBAAoB,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,KAAwC,GAAA,KAAQ,MAAS,CAAC,CAAA;AACrG;AAIA,IAAM,OAAA,GAAU,CAAC,GAAA,KAA2B,KAAA,CAAM,QAAQ,GAAG,CAAA,GAAK,GAAA,CAAI,CAAC,CAAA,GAAiB,GAAA;AAGxF,eAAe,QAAA,CAAS,IAAA,EAAqB,SAAA,EAAmB,KAAA,EAAe,KAAa,IAAA,EAAqC;AAC/H,EAAA,MAAM,QAAA,GAAW,GAAA;AACjB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,QAAA,EAAU;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,QAAQ,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,WAAW,SAAS,CAAA,QAAA,EAAW,KAAK,CAAA,SAAA,EAAY,GAAG,SAAS,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAC,KAAK,IAAI,CAAA;AACjI,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,eAAe,uBAAA,CAAwB,MAAqB,OAAA,EAAkC;AAC5F,EAAA,MAAM,MAAM,MAAM,QAAA,CAAS,MAAM,eAAA,EAAiB,aAAA,EAAe,kBAAkB,OAAO,CAAA;AAC1F,EAAA,MAAM,aAAA,CAAc,MAAM,CAAC,GAAG,IAAI,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AAC7C;AAEA,eAAe,YAAA,CAAa,MAAqB,GAAA,EAA8B;AAC7E,EAAA,MAAM,EAAA,GAAK,CAAC,GAAG,IAAI,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO,OAAO,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5D,EAAA,IAAI,EAAA,CAAG,WAAW,CAAA,EAAG;AACrB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqC;AACvD,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,EAAQ,KAAK,GAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,IAAI,GAAG,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,mDAAmD,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,IAAI,CAAA;AACxH,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG,aAAA,CAAuC,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AAAA,EAC5G;AACA,EAAA,MAAM,UAAqC,EAAC;AAC5C,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAK,EAAA,EAAI;AAClB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACxB,IAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,SACtB,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACrB;AACA,EAAA,MAAM,iBAAA,CAAkB,MAAM,OAAO,CAAA;AACrC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,CAAA,CAAE,EAAE,CAAC,EAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAC,CAAC,CAAC,CAAA;AAChF,EAAA,MAAM,uBAAA,CAAwB,MAAM,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,CAAS,IAAA,EAAM,aAAA,EAAe,SAAA,EAAW,OAAO,CAAA;AACtD,EAAA,MAAM,QAAA,CAAS,IAAA,EAAM,aAAA,EAAe,gBAAA,EAAkB,OAAO,CAAA;AAC7D,EAAA,MAAM,QAAA,CAAS,IAAA,EAAM,aAAA,EAAe,aAAA,EAAe,OAAO,CAAA;AAC1D,EAAA,MAAM,QAAA,CAAS,IAAA,EAAM,eAAA,EAAiB,aAAA,EAAe,OAAO,CAAA;AAC9D;AAGA,eAAe,aAAA,CAAc,MAAqB,GAAA,EAA8B;AAC9E,EAAA,MAAM,EAAA,GAAK,CAAC,GAAG,IAAI,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO,OAAO,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5D,EAAA,IAAI,EAAA,CAAG,WAAW,CAAA,EAAG;AACrB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqC;AACvD,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,EAAQ,KAAK,GAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,IAAI,GAAG,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,yDAAyD,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,IAAI,CAAA;AAC9H,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG,aAAA,CAAuC,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AAAA,EAC5G;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,QAAQ,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,EAAE,MAAM,CAAC,EAAE,MAAA,CAAO,CAAC,MAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9F,EAAA,MAAM,KAAA,GAAQ,MAAM,gBAAA,CAAiB,IAAA,EAAM,OAAO,CAAA;AAClD,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,iBAAA,CAAkB,KAAA,EAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AACjF,EAAA,MAAM,QAAA,CAAS,IAAA,EAAM,aAAA,EAAe,eAAA,EAAiB,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA;AACtF;AAWA,IAAM,OAAA,GAA0D;AAAA,EAC9D,KAAA,EAAO,OAAA;AAAA,EACP,WAAA,EAAa;AACf,CAAA;AAEA,eAAe,gBAAA,CAAiB,IAAA,EAAqB,GAAA,EAAe,MAAA,EAA8C;AAChH,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,CAAC,MAAM,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAM,KAAK,MAAM,CAAA;AAC7C,EAAA,OAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,YAAA,CAAa,GAAA,EAAK,GAAG,CAAC,CAAA;AACjD;AAGA,eAAsB,aAAA,CACpB,MACA,GAAA,EAC4B;AAC5B,EAAA,MAAM,MAAA,GAAiB;AAAA,IACrB,OAAO,EAAC;AAAA,IAAG,QAAQ,EAAC;AAAA,IAAG,aAAa,EAAC;AAAA,IAAG,gBAAgB,EAAC;AAAA,IACzD,UAAA,EAAY,KAAA;AAAA,IAAO,WAAA,EAAa;AAAA,GAClC;AACA,EAAA,MAAM,UAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK,IAAI,EAAA,KAAO,IAAA,IAAQ,OAAO,EAAA,KAAO,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,KAAK,yBAAyB,CAAA;AAC3I,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA,CAAO,CAAC,EAAA,KAA2C,EAAA,CAAG,OAAO,OAAO,CAAA;AACvF,EAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,EAAA,KAAM,EAAA,CAAG,KAAK,CAAC,CAAC,CAAA;AAC3D,EAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,CAAG,UAAU,KAAK,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,EAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAA,EAAA,KAAM,EAAA,CAAG,GAAG,CAAC,CAAA;AACnF,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACxB,MAAA,IAAI,CAAC,SAAA,CAAU,MAAA,CAAO,CAAC,KAAK,IAAA,EAAM,EAAA,CAAG,KAAK,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,0CAA0C,sBAAsB,CAAA;AAAA,IAC3I,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,MAAM,YAAY,YAA2B;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,KAAA,GAAQ,OAAA;AACd,IAAA,OAAA,GAAU,MAAA;AACV,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC/B,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAM,MAAM,GAAA,EAAK,KAAA,CAAM,QAAQ,OAAO,CAAA;AACjE,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,IAAI,MAAM,MAAA,CAAO,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,OAAO,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,SAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAC,CAAA;AAClE,IAAA,IAAI,KAAA,CAAM,IAAI,IAAA,KAAS,OAAA,SAAgB,WAAA,CAAY,IAAA,CAAK,GAAG,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,WAAS,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,KAAA,CAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAW,CAAA;AACjK,IAAA,IAAI,KAAA,CAAM,IAAI,IAAA,KAAS,UAAA,SAAmB,cAAA,CAAe,IAAA,CAAK,GAAG,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,WAAS,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,KAAA,CAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAc,CAAA;AAC1K,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,EACtB,CAAA;AACA,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,IAAI,EAAA,CAAG,OAAO,OAAA,EAAS;AAAE,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAG,MAAA;AAAA,IAAU;AACvD,IAAA,MAAM,KAAA,GAAQ,OAAA,IAAW,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,MAAA;AACzC,IAAA,MAAM,GAAA,GAAM,gBAAgB,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7E,IAAA,MAAM,OAAgB,OAAO,EAAA,CAAG,EAAA,KAAO,QAAA,GAAW,GAAG,EAAA,GAAK,MAAA;AAC1D,IAAA,IAAI,EAAA,CAAG,OAAO,KAAA,EAAO;AACnB,MAAA,IAAI,WAAW,OAAA,CAAQ,GAAA,CAAI,SAAS,GAAA,CAAI,IAAA,QAAY,SAAA,EAAU;AAC9D,MAAA,CAAC,OAAA,KAAY,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAG,EAAG,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAAA,IACxD,CAAA,MAAA,IAAW,EAAA,CAAG,EAAA,KAAO,QAAA,EAAU;AAC7B,MAAA,MAAM,SAAA,EAAU;AAChB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC7B,MAAA,IAAI,IAAA,EAAM;AAER,QAAA,KAAA,MAAW,GAAA,IAAO,MAAM,gBAAA,CAAiB,IAAA,EAAM,GAAA,EAAK,EAAA,CAAG,GAAwB,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACzG;AACA,MAAA,MAAM,UAAA,CAAW,IAAA,EAAM,GAAA,EAAK,EAAA,CAAG,GAAwB,CAAA;AACvD,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB,CAAA,MAAA,IAAW,EAAA,CAAG,EAAA,KAAO,OAAA,EAAS;AAC5B,MAAA,MAAM,SAAA,EAAU;AAChB,MAAA,MAAM,SAAA,CAAU,MAAM,GAAG,CAAA;AACzB,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,OAAA,EAAS,MAAA,CAAO,UAAA,GAAa,IAAA;AAAA,WAAA,IACrC,GAAA,CAAI,IAAA,KAAS,aAAA,EAAe,MAAA,CAAO,WAAA,GAAc,IAAA;AAC1D,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,oDAAoD,MAAA,CAAO,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAChG;AAAA,EACF;AACA,EAAA,MAAM,SAAA,EAAU;AAChB,EAAA,MAAM,UAAA,GAAA,CAAc,MAAM,OAAA,CAAQ,IAAA,EAAM,gBAAgB,OAAO,CAAA,EAAG,CAAC,GAAG,IAAI,GAAA,CAAI,OAAO,WAAA,CAAY,GAAA,CAAI,UAAQ,IAAA,CAAK,EAAE,CAAC,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA;AACxI,EAAA,MAAM,aAAA,GAAA,CAAiB,MAAM,OAAA,CAAQ,IAAA,EAAM,gBAAgB,UAAU,CAAA,EAAG,CAAC,GAAG,IAAI,GAAA,CAAI,OAAO,cAAA,CAAe,GAAA,CAAI,aAAW,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA;AACvJ,EAAA,MAAM,kBAAA,CAAmB,UAAA,EAAY,aAAA,EAAe,CAAA,IAAA,KAAQ,OAAA,CAAQ,MAAM,eAAA,CAAgB,iBAAiB,CAAA,EAAG,IAAgB,CAA2C,CAAA;AACzK,EAAA,MAAM,OAAA,CAAQ,MAAM,MAAM,CAAA;AAC1B,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,OAAA,CAAQ,MAAqB,MAAA,EAA+B;AAIzE,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,MAAM,IAAA,CAAK,KAAK,CAAA,yBAAA,CAA2B,CAAA;AAC3C,IAAA,MAAM,IAAA,CAAK,KAAK,CAAA,kFAAA,CAAoF,CAAA;AACpG,IAAA,MAAM,IAAA,CAAK,KAAK,CAAA,+EAAA,CAAiF,CAAA;AACjG,IAAA,MAAM,IAAA,CAAK,KAAK,CAAA,iFAAA,CAAmF,CAAA;AAAA,EACrG;AACA,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,MAAM,IAAA,CAAK,KAAK,CAAA,yBAAA,CAA2B,CAAA;AACnE,EAAA,MAAM,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AACrC,EAAA,MAAM,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AACzC;AAOA,eAAsB,mBAAmB,IAAA,EAAoC;AAC3E,EAAA,MAAM,IAAA,CAAK,IAAA;AAAA,IACT,+BAA+B,YAAY,CAAA,iDAAA;AAAA,GAC7C;AACA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ,MAAM,KAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAA,CAAG,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,0BAAA,CAA4B,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,cAAuC,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AAC5F,EAAA,MAAM,iBAAA,CAAkB,MAAM,QAAQ,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,gCAAA,CAAkC,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ,cAAuC,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AAG9F,EAAA,MAAM,KAAA,GAAQ,oBAAoB,QAAQ,CAAA;AAC1C,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,iBAAA,CAAkB,KAAA,EAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AACpF,EAAA,MAAM,IAAA,CAAK,IAAA;AAAA,IACT,gBAAgB,YAAY,CAAA,6FAAA,CAAA;AAAA,IAC5B,CAAC,sBAAsB,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,yBAAA,EAA2B,CAAC;AAAA,GAC/E;AACF;AAIA,eAAsB,iBAAiB,EAAA,EAA6B;AAClE,EAAA,MAAM,UAAU,EAAE,CAAA;AAClB,EAAA,MAAM,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AACjC,IAAA,MAAM,EAAA,CAAG,IAAA;AAAA,MACP,+BAA+B,YAAY,CAAA,iDAAA;AAAA,KAC7C;AACA,IAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,KAAA,CAAM,wBAAwB,YAAY,CAAA,iBAAA,CAAA,EAAqB,CAAC,oBAAoB,CAAC,CAAA;AAChH,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG;AAChB,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MAC/C,CAAA,CAAA,MAAQ;AACN,QAAA,KAAA,GAAQ,MAAA;AAAA,MACV;AAAA,IACF;AACA,IAAA,IAAI,KAAA,EAAO,YAAY,yBAAA,EAA2B;AAClD,IAAA,MAAM,mBAAmB,EAAE,CAAA;AAAA,EAC7B,CAAC,CAAA;AACH;AAGA,eAAsB,WAAW,IAAA,EAAoC;AACnE,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ,MAAM,KAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAA,CAAG,CAAA;AAC9D;AAIO,IAAM,WAAW,EAAA,GAAK;AAC7B,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,SAAA,GAAY,CAAA;AAIlB,IAAM,UAAA,GAAa,CAAC,IAAA,EAAM,QAAA,EAAU,QAAQ,SAAA,EAAW,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAEjF,IAAM,QAAA,GAAW,CAAC,GAAA,EAA8B,OAAA,KAC9C,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA;AAEnD,SAAS,IAAI,GAAA,EAA2B;AACtC,EAAA,OAAO,IAAI,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA;AAClC;AAEA,SAAS,QAAA,CAAS,GAAY,IAAA,EAAwB;AACpD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,UAAA,EAAY;AAC9D,IAAA,MAAM,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,WAAA,EAAc,UAAU,CAAA,OAAA,CAAS,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AAClB,IAAA,IAAI,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,SAAS,CAAA,IAAK,CAAA,CAAE,SAAS,aAAA,EAAe;AACrE,MAAA,MAAM,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,oBAAA,EAAuB,aAAa,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACH;AAGA,SAAS,cAAA,CAAe,GAAY,IAAA,EAA6B;AAC/D,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,OAAO,CAAA,KAAM,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,MAAM,GAAA,CAAI,6BAA6B,CAAA;AACpG,EAAA,MAAM,GAAA,GAAM,CAAA;AACZ,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,MAAM,IAAI,0BAA0B,CAAA;AACnE,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,YAAY,GAAA,EAAK;AACnB,IAAA,IAAI,OAAO,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW,MAAM,IAAI,kCAAkC,CAAA;AACjF,IAAA,MAAA,GAAS,GAAA,CAAI,MAAA;AAAA,EACf;AACA,EAAA,IAAK,UAAA,CAAiC,QAAA,CAAS,KAAK,CAAA,EAAG;AACrD,IAAA,IAAI,CAAC,SAAS,GAAA,EAAK,CAAC,SAAS,QAAA,EAAU,QAAQ,CAAC,CAAA,EAAG;AACjD,MAAA,MAAM,GAAA,CAAI,CAAA,UAAA,EAAa,KAAK,CAAA,iCAAA,CAAmC,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,UAAA,EAAa,KAAK,CAAA,OAAA,CAAS,CAAA,EAAG,GAAI,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI,EAAC,EAAG;AAAA,EAC3G;AACA,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,EAAK,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA,IAAK,MAAA,EAAQ,MAAM,GAAA,CAAI,4CAA4C,CAAA;AACxG,IAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,IAAY,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,aAAA,EAAe;AAC7F,MAAA,MAAM,IAAI,4CAA4C,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,EAC3C;AACA,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,IAAI,CAAC,SAAS,GAAA,EAAK,CAAC,SAAS,OAAA,EAAS,KAAA,EAAO,cAAc,CAAC,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAI,0DAA0D,CAAA;AAAA,IACtE;AACA,IAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAsB;AAC/B,MAAA,IAAI,OAAO,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,MAAM,GAAA,CAAI,CAAA,eAAA,EAAkB,CAAC,CAAA,wBAAA,CAA0B,CAAA;AACnH,MAAA,OAAO,IAAI,CAAC,CAAA;AAAA,IACd,CAAA;AACA,IAAA,IAAI,cAAA,IAAkB,GAAA,IAAO,OAAO,GAAA,CAAI,iBAAiB,SAAA,EAAW;AAClE,MAAA,MAAM,IAAI,6CAA6C,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,EAAE,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE,KAAK,GAAG,GAAI,GAAA,CAAI,iBAAiB,IAAA,GAAO,EAAE,cAAc,IAAA,EAAK,GAAI,EAAC,EAAG;AAAA,EACzH;AACA,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,MAAM,GAAA,CAAI,kDAAkD,CAAA;AACnF,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,EAAK,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA,EAAG,MAAM,GAAA,CAAI,4CAA4C,CAAA;AAC9F,IAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,SAAA,EAAW,MAAM,IAAI,sCAAsC,CAAA;AACpF,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,EAC3C;AACA,EAAA,IAAI,UAAU,aAAA,EAAe;AAC3B,IAAA,IAAI,CAAC,SAAS,GAAA,EAAK,CAAC,OAAO,CAAC,CAAA,EAAG,MAAM,GAAA,CAAI,4CAA4C,CAAA;AACrF,IAAA,OAAO,EAAE,OAAO,aAAA,EAAc;AAAA,EAChC;AACA,EAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,MAAM,GAAA,CAAI,0DAA0D,CAAA;AAC3F,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,EAAK,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA,EAAG,MAAM,GAAA,CAAI,oDAAoD,CAAA;AACtG,IAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,SAAA,EAAW,MAAM,IAAI,8CAA8C,CAAA;AAC5F,IAAA,OAAO,EAAE,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,EACnD;AACA,EAAA,MAAM,GAAA,CAAI,CAAA,yBAAA,EAA4B,KAAK,CAAA,CAAE,CAAA;AAC/C;AAEA,SAAS,YAAA,CAAa,CAAA,EAAY,IAAA,EAAY,IAAA,EAAiC;AAC7E,EAAA,IAAI,CAAA,KAAM,MAAA,EAAW,OAAO,EAAC;AAC7B,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAC,GAAG,MAAM,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAC3D,EAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa,MAAM,IAAI,CAAA,EAAG,IAAI,CAAA,kBAAA,EAAqB,WAAW,CAAA,QAAA,CAAU,CAAA;AACvF,EAAA,OAAO,EAAE,GAAA,CAAI,CAAC,MAAM,cAAA,CAAe,CAAA,EAAG,IAAI,CAAC,CAAA;AAC7C;AAEA,SAAS,SAAA,CAAU,OAAe,IAAA,EAAoB;AACpD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,WAAA,EAAa,OAAO,KAAA;AACpD,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,IAAI,UAAU,WAAA,IAAe,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,YAAY,OAAO,KAAA;AAClF,IAAA,MAAM,GAAA,CAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,OAAA,GAAU,SAAS,KAAK,CAAA,kCAAA,CAAA,GAAuC,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,EACxI;AACA,EAAA,IAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,OAAA,EAAS,OAAO,KAAA;AAClD,EAAA,MAAM,GAAA;AAAA,IACJ,KAAA,KAAU,WAAA,IAAe,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,aACvD,CAAA,MAAA,EAAS,KAAK,CAAA,gCAAA,CAAA,GACd,CAAA,qBAAA,EAAwB,KAAK,CAAA;AAAA,GACnC;AACF;AAWA,SAAS,WAAW,IAAA,EAA4B;AAC9C,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAM,GAAA,CAAI,mCAAmC,CAAA;AACnH,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,QAAA,IAAY,SAAS,SAAA,EAAW;AAC/D,IAAA,MAAM,IAAI,4CAA4C,CAAA;AAAA,EACxD;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,IAAA,IAAI,CAAC,CAAC,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG;AAC7E,MAAA,MAAM,GAAA,CAAI,CAAA,2BAAA,EAA8B,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,MAAM,QAA4C,EAAC;AACnD,EAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAW;AAC3B,IAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG,MAAM,IAAI,wBAAwB,CAAA;AACjE,IAAA,IAAI,GAAA,CAAI,MAAM,MAAA,GAAS,SAAA,QAAiB,GAAA,CAAI,CAAA,uBAAA,EAA0B,SAAS,CAAA,KAAA,CAAO,CAAA;AACtF,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,KAAA,EAAO;AAC7B,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,MAAM,GAAA,CAAI,+BAA+B,CAAA;AAClH,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAAU,MAAM,IAAI,sBAAsB,CAAA;AACjE,MAAA,IAAI,CAAC,QAAA,CAAS,CAAA,EAAG,CAAC,OAAA,EAAS,WAAW,CAAC,CAAA,EAAG,MAAM,GAAA,CAAI,2CAA2C,CAAA;AAC/F,MAAA,IAAI,CAAA,CAAE,cAAc,MAAA,IAAa,CAAA,CAAE,cAAc,KAAA,IAAS,CAAA,CAAE,cAAc,MAAA,EAAQ;AAChF,QAAA,MAAM,IAAI,oCAAoC,CAAA;AAAA,MAChD;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,CAAU,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,SAAA,KAAc,MAAA,EAAQ,CAAA;AAAA,IAC9E;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkC;AAC/C,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM,OAAO,MAAA;AAC1C,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG,MAAM,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,mBAAA,CAAqB,CAAA;AACtF,IAAA,IAAI,IAAI,CAAA,EAAG,MAAM,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,aAAA,CAAe,CAAA;AACxC,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAGA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA,EAAW,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,MAAM,WAAW,CAAA;AAAA,IACxD,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IAClD,KAAA;AAAA,IACA,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA,IAAK,CAAA;AAAA,IAC3B,KAAA,EAAO,MAAM,OAAO;AAAA,GACtB;AACF;AAIA,IAAM,MAAN,MAAU;AAAA,EAER,YAAqB,EAAA,EAAa;AAAb,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAc;AAAA,EAAd,EAAA;AAAA,EADZ,SAAqB,EAAC;AAAA,EAE/B,KAAK,CAAA,EAAqB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAClB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAEA,QAAA,CAAS,KAAa,MAAA,EAAwB;AAC5C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA;AACxC,IAAA,OAAO,IAAA,CAAK,EAAA,GAAK,CAAA,OAAA,EAAU,GAAG,CAAA,EAAA,EAAK,CAAC,CAAA,KAAA,CAAA,GAAU,CAAA,MAAA,EAAS,GAAG,CAAA,EAAA,EAAK,CAAC,CAAA,KAAA,CAAA;AAAA,EAClE;AAAA,EACA,MAAA,CAAO,KAAa,MAAA,EAA0B;AAC5C,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACjE;AACF,CAAA;AAIA,IAAM,mBAAmB,CAAC,SAAA,EAAW,SAAS,QAAA,EAAU,YAAA,EAAc,cAAc,SAAS,CAAA;AAE7F,SAAS,aAAA,CAAc,GAAA,EAAU,IAAA,EAAc,GAAA,EAAa,UAAyB,UAAA,EAA4B;AAC/G,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,SAAA;AACH,MAAA,OAAO,IAAI,UAAU,CAAA,KAAA,CAAA;AAAA,IACvB,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAEH,MAAA,OAAO,CAAA,QAAA,EAAW,GAAG,CAAA,mCAAA,EAAsC,GAAG,CAAA,8BAAA,CAAA;AAAA,IAChE,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,oBAAA,EAAuB,GAAG,+BAA+B,GAAG,CAAA,oBAAA,CAAA;AAAA,IAC5E,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,WAAW,GAAG,CAAA,oBAAA,CAAA;AAAA,IACvB,KAAK,YAAA;AACH,MAAA,OAAO,QAAA,GACH,IAAI,GAAG,CAAA,oBAAA,EAAuB,QAAQ,CAAA,iBAAA,EAAoB,QAAQ,CAAA,iBAAA,CAAA,GAClE,CAAA,CAAA,EAAI,GAAG,CAAA,gBAAA,CAAA;AAAA,IACb;AAEE,MAAA,OAAO,IAAI,GAAG,CAAA,GAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA;AAExC;AAEA,SAAS,mBAAmB,GAAA,EAAU,MAAA,EAAkB,MAAA,EAAiB,GAAA,EAAa,UAAyB,UAAA,EAA4B;AACzI,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,aAAA,CAAc,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,QAAA,EAAU,UAAU,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AAC/F,EAAA,OAAO,MAAA,GAAS,CAAA,cAAA,EAAiB,OAAO,CAAA,SAAA,CAAA,GAAc,OAAA;AACxD;AAEA,IAAM,OAAO,CAAC,MAAA,EAAiB,aAC7B,MAAA,GAAS,CAAA,eAAA,EAAkB,QAAQ,CAAA,SAAA,CAAA,GAAc,QAAA;AAEnD,SAAS,YAAA,CAAa,GAAA,EAAU,CAAA,EAAoB,IAAA,EAAoB;AACtE,EAAA,MAAM,SAAS,IAAA,KAAS,QAAA;AACxB,EAAA,MAAM,EAAA,GAAK,SAAS,mBAAA,GAAsB,aAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,SAAS,eAAA,GAAkB,eAAA;AACvC,EAAA,MAAM,QAAA,GAAW,SAAS,IAAA,GAAO,eAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAA,GAAkB,eAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,SAAS,aAAA,GAAgB,aAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,SAAS,aAAA,GAAgB,aAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,SAAS,oBAAA,GAAuB,aAAA;AAC/C,EAAA,QAAQ,EAAE,KAAA;AAAO,IACf,KAAK,IAAA;AACH,MAAA,OAAO,IAAA,CAAK,EAAE,MAAA,KAAW,IAAA,EAAM,IAAI,MAAA,CAAO,EAAA,EAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACzD,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,EAAE,MAAA,KAAW,IAAA,EAAM,IAAI,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IAC7D,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK,EAAE,MAAA,KAAW,IAAA,EAAM,IAAI,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IAC9D,KAAK,SAAA;AACH,MAAA,OAAO,IAAA,CAAK,EAAE,MAAA,KAAW,IAAA,EAAM,IAAI,MAAA,CAAO,UAAA,EAAY,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACjE,KAAK,QAAA;AACH,MAAA,OAAO,kBAAA,CAAmB,KAAK,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAA,KAAW,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AAAA,IACvF,KAAK,MAAA;AAEH,MAAA,OAAO,IAAA;AAAA,QACL,EAAE,MAAA,KAAW,IAAA;AAAA,QACb,CAAA,wGAAA,EAC8B,MAAM,CAAA,0BAAA,EAA6B,CAAA,CAAE,OAAO,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,KAAK,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,OAC9G;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO,IAAA;AAAA,QACL,EAAE,MAAA,KAAW,IAAA;AAAA,QACb,MAAA,GACI,CAAA,6IAAA,EACyE,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAC,CAAA,GAAA,CAAA,GACpH,CAAA,kEAAA,EAAqE,MAAM,CAAA,4BAAA,EAC3C,CAAA,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,GAAA,CAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,OACjF;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,GAAS,IAAI,QAAA,CAAS,qBAAA,EAAuB,EAAE,KAAK,CAAA,GACvD,IAAI,GAAA,CAAI,QAAA,CAAS,oBAAoB,CAAA,CAAE,KAAK,CAAC,CAAA,IAAA,EAAO,GAAA,CAAI,SAAS,iBAAA,EAAmB,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAClG,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,SAAS,oBAAA,GAAuB,oCAAA;AAC7C,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA;AACzB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,YAAA,GAAe,GAAA,GAAM,IAAA;AACnC,MAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,EAAO,EAAE,QAAQ,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAA;AAAA,IACnD;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,CAAE,QAAQ,CAAA,sBAAA,CAAA,GAA2B,CAAA,kDAAA,CAAA;AAAA,IAC9C,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,GAAA,CAAI,CAAC,MAAM,aAAA,CAAc,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,QAAA,EAAU,UAAU,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AACrG,MAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,YAAA,EAAe,GAAG,YAAY,GAAG,CAAA,CAAA,CAAA;AAAA,IACjD;AAAA,IACA,KAAK,cAAA;AACH,MAAA,OAAO,CAAA,CAAE,QACL,CAAA,kDAAA,CAAA,GACA,CAAA,uPAAA,CAAA;AAAA;AAIV;AAEA,SAAS,UAAA,CAAW,GAAA,EAAU,OAAA,EAA4B,IAAA,EAAoB;AAC5E,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AACjC,EAAA,OAAO,CAAA,OAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,GAAA,EAAK,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAC/E;AAEA,SAAS,QAAA,CAAS,OAA2C,IAAA,EAAoB;AAC/E,EAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,QAAA,GAAW,mBAAA,GAAsB,aAAA;AACxD,EAAA,MAAM,IAAA,GACJ,SAAS,QAAA,GACL,EAAE,IAAI,mBAAA,EAAqB,SAAA,EAAW,gBAAA,EAAkB,SAAA,EAAW,gBAAA,EAAkB,QAAA,EAAU,iBAAiB,QAAA,EAAU,aAAA,EAAc,GACxI,EAAE,EAAA,EAAI,aAAA,EAAe,WAAW,gBAAA,EAAkB,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,WAAA,EAAY;AAG7F,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,EAAE,KAAA,EAAO,IAAA,OAChC,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA,iBAAA,CAAA,GAAsB,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA,eAAA;AAAA,GAC3D;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,IAAA,CAAM,CAAA;AACnE,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,SAAA,CAAU,GAAgB,EAAA,EAAqB;AACtD,EAAA,IAAI,CAAA,GAAI,EAAA;AACR,EAAA,IAAI,EAAE,KAAA,KAAU,MAAA,EAAW,CAAA,IAAK,CAAA,OAAA,EAAU,EAAE,KAAK,CAAA,CAAA;AAAA,OAAA,IACxC,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAC,IAAI,CAAA,IAAK,WAAA;AACnC,EAAA,IAAI,EAAE,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,CAAA,QAAA,EAAW,EAAE,MAAM,CAAA,CAAA;AAC1C,EAAA,OAAO,CAAA;AACT;AAGA,eAAe,KAAK,IAAA,EAAoC;AACtD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,wEAAA,CAA0E,CAAA;AACxG,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA;AACpC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,GAAA;AAAA,MACA,6BAA6B,KAAK,CAAA,sDAAA,CAAA;AAAA,MAClC;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,IAAA,EAAoB;AACrC,EAAA,OAAO,IAAA,KAAS,WAAW,iBAAA,GAAoB,iBAAA;AACjD;AAEA,eAAe,OAAA,CAAQ,IAAA,EAAqB,CAAA,EAAgB,EAAA,EAAyC;AACnG,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAE5B,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,EAAE,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,EAAQ,CAAA,CAAE,WAAW,IAAI,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,EAAE,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,EAAW,CAAA,CAAE,SAAS,IAAI,CAAA;AACzD,EAAA,MAAM,YAAwB,CAAC,GAAG,OAAO,MAAA,EAAQ,GAAG,UAAU,MAAM,CAAA;AACpE,EAAA,MAAM,SAAA,GACJ,QAAA,IAAY,WAAA,GACR,CAAA,EAAG,QAAQ,CAAA,KAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA,CAAA,GACtD,QAAA,IAAY,WAAA;AAElB,EAAA,MAAM,QAAQ,OAAO,KAAA,EAAe,WAClC,MAAA,CAAA,CAAQ,MAAM,KAAK,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAK,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,MAAM,GAAG,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA;AAC9F,EAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,QAAA,EAAU,OAAO,MAAM,CAAA;AACzD,EAAA,MAAM,YAAA,GAAe,EAAE,OAAA,CAAQ,MAAA,KAAW,IAAI,aAAA,GAAgB,MAAM,KAAA,CAAM,SAAA,EAAW,SAAS,CAAA;AAE9F,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AAE9B,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,MAAMC,QAAAA,GAAU,yBAAyB,KAAK,CAAA,EAAG,SAAS,CAAA,UAAA,EAAa,QAAQ,GAAG,MAAM,CAAA,CAAA;AACxF,IAAA,MAAMF,KAAAA,GAAAA,CAAmB,MAAM,IAAA,CAAK,KAAA,CAAME,UAAS,SAAS,CAAA,EAAG,GAAA,CAAI,CAAC,MAAM,aAAA,CAAc,MAAA,CAAO,CAAA,CAAE,OAAO,CAAC,CAAC,CAAA;AAC1G,IAAA,MAAM,MAAA,GAAS,EAAE,iBAAA,EAAmB,yBAAA,EAA2B,eAAe,YAAA,EAAc,IAAA,EAAM,MAAAF,KAAAA,EAAK;AAEvG,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,oCAAoC,KAAK,CAAA,EAAG,SAAS,CAAA,UAAA,EAAa,QAAQ,GAAG,MAAM,CAAA,CAAA;AACnG,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,SAAS,CAAA;AACpD,EAAA,MAAM,OAAA,GAA+C,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,EAAC,EAAG,EAAC,EAAG,EAAE,CAAC,CAAA;AACpF,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9D,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,MAAA,EAAQ,SAAS,GAAA,EAAK;AACzD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,GAAA,KAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA;AAC7E,IAAA,MAAM,eAAe,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,EAAE,GAAA,EAAK,CAAA,qJAAA,EAAwJ,YAAY,CAAA,iBAAA,CAAA,EAAqB,QAAQ,GAAA,EAAI;AAAA,MAC5M,EAAE,GAAA,EAAK,CAAA,yGAAA,EAA4G,YAAY,CAAA,iBAAA,CAAA,EAAqB,QAAQ,GAAA,EAAI;AAAA,MAChK,EAAE,GAAA,EAAK,CAAA,+JAAA,EAAkK,YAAY,CAAA,oBAAA,CAAA,EAAwB,QAAQ,GAAA;AAAI,KAC3N;AACA,IAAA,MAAM,SAAA,GAAY,KAAK,KAAA,GAAQ,MAAM,KAAK,KAAA,CAAM,UAAU,CAAA,GAAI,MAAA,CAAO,YAAY;AAC/E,MAAA,MAAMA,QAAO,EAAC;AACd,MAAA,KAAA,MAAW,SAAA,IAAa,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,GAAA,EAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/F,MAAA,OAAOA,KAAAA;AAAA,IACT,CAAA,GAAG;AACH,IAAA,SAAA,CAAU,QAAQ,CAACA,KAAAA,EAAM,QAAA,KAAaA,KAAAA,CAAK,QAAQ,CAAA,GAAA,KAAO;AACxD,MAAA,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA;AACvC,MAAA,IAAI,CAAA,KAAM,MAAA,EAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAC,CAAA;AAAA,IACnF,CAAC,CAAC,CAAA;AAAA,EACJ;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM;AACpC,IAAA,MAAM,CAAC,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA,GAAI,QAAQ,CAAC,CAAA;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,aAAA,CAAc,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,EACxE,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,iBAAA,EAAmB,yBAAA,EAA2B,aAAA,EAAe,YAAA,EAAc,MAAM,IAAA,EAAK;AACjG;AAIA,eAAsB,iBAAA,CAAkB,IAAc,IAAA,EAA2C;AAC/F,EAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAC7B,EAAA,OAAO,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AAElC,IAAA,IAAI,GAAG,OAAA,KAAY,UAAA,EAAY,MAAM,EAAA,CAAG,KAAK,2DAA2D,CAAA;AACxG,IAAA,MAAM,KAAK,EAAE,CAAA;AACb,IAAA,OAAO,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,EAAA,CAAG,YAAY,UAAU,CAAA;AAAA,EACrD,CAAC,CAAA;AACH;AChtBO,IAAM,aAAN,MAAqC;AAAA,EACzB,EAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACT,YAAA;AAAA,EAER,WAAA,CAAY,EAAA,EAAc,OAAA,GAA6B,EAAC,EAAG;AACzD,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,kBAAkB,YAAY;AACjC,MAAA,IAAI;AACF,QAAA,MAAM,eAAA,CAAgB,KAAK,EAAE,CAAA;AAC7B,QAAA,MAAM,gBAAA,CAAiB,KAAK,EAAE,CAAA;AAAA,MAChC,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA,EAIA,WAAA,GAA6B;AAC3B,IAAA,OAAO,KAAK,KAAA,EAAM;AAAA,EACpB;AAAA,EAEA,IAAI,KAAA,EAA4B;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAC3B,IAAA,IAAI,CAAC,KAAK,MAAM,IAAI,aAAa,GAAA,EAAK,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAA,CAAG,CAAA;AAC5E,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,QAAA,CACN,KAAA,EACA,IAAA,EACA,OAAA,EACA,QACA,OAAA,EAC+B;AAC/B,IAAA,OAAO,IAAI,QAAA,CAAuB,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChG;AAAA,EAEA,SAA8B,KAAA,EAAwC;AACpE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEA,UAA+B,KAAA,EAAyC;AACtE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,YAAY,KAAA,EAA4D;AAC5E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,iBAAA,CAAkB,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AAAA,IAC/C,SAAS,CAAA,EAAG;AAEV,MAAA,IAAI,CAAA,YAAa,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,iCAAiC,OAAO,MAAA;AACpF,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,MAAA,EACA,IAAA,EACA,EAAA,EACY;AACZ,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,IAAA,KAAS,aAAa,EAAE,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,eAAA,CACJ,MAAA,EACA,EAAA,EACY;AACZ,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA;AAAA,EACpC;AAAA,EAEQ,KAAA,CACN,MAAA,EACA,WAAA,EACA,EAAA,EACY;AACZ,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAe,MAAM,CAAA;AACxC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAC5C,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAe;AACnC,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,OAAO,IAAA,KAAS;AACzC,MAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAA2B;AAC7C,QAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG;AACtB,UAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,CAAA,OAAA,EAAU,KAAK,yCAAyC,oBAAoB,CAAA;AAAA,QAC1G;AAAA,MACF,CAAA;AACA,MAAA,MAAM,EAAA,GAA0B;AAAA,QAC9B,QAAA,EAAU,CAAsB,KAAA,KAAa;AAC3C,UAAA,UAAA,CAAW,KAAK,CAAA;AAChB,UAAA,OAAO,KAAK,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAO,CAAA;AAAA,QAC1D,CAAA;AAAA,QACA,SAAA,EAAW,CAAsB,KAAA,KAAa;AAC5C,UAAA,UAAA,CAAW,KAAK,CAAA;AAChB,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,iCAAA,EAAmC,uBAAuB,CAAA;AAAA,UACxF;AACA,UAAA,OAAO,KAAK,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,QAAQ,OAAO,CAAA;AAAA,QACzD;AAAA,OACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,EAAE,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,UAAA,CAAW,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,EAAG,MAAA,EAAQ,OAAO,CAAA;AACtE,MAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,QAAA,MAAM,aAAA,CAAc,MAAM,GAAG,CAAA;AAAA,MAC/B;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,GAAgC;AACpC,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,8CAA8C,CAAA;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,OAAO,IAAA,KAAS;AACxC,QAAA,MAAM,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AAAA,UACnC,GAAA,EAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,UAAA,EAAY,CAAA,CAAA;AAAA,UACjD,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,MAAM,QAAA;AAAA,MACR,CAAC,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,KAAM,UAAU,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AACtC,MAAA,MAAM,SAAS,EAAE,CAAA;AACjB,MAAA,MAAM,WAAW,EAAE,CAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,MAAM,SAAS,GAAA,EAA4B;AACzC,IAAA,MAAM,IAAA,CAAK,GAAG,WAAA,CAAY,CAAC,OAAO,aAAA,CAAc,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,KAAA,CAAM,OAAkB,KAAA,EAAyB;AAC/C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,IAAY;AACxC,IAAA,OAAO,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA,GAAI,KAAA;AAAA,EACzD;AACF;AAQA,IAAM,WAAN,MAAgD;AAAA,EAC9C,YACmB,KAAA,EACA,GAAA,EACA,OACA,IAAA,EACA,OAAA,EACA,QACA,OAAA,EACjB;AAPiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAPgB,KAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAGX,aAAA,GAAsB;AAC5B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,GAAG,IAAA,CAAK,KAAK,wBAAwB,gBAAgB,CAAA;AAAA,IACnF;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,GAAA,EAAqD;AAC7D,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAC3B,IAAA,MAAM,QAAQ,WAAA,CAAe,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,KAAK,MAAM,CAAA;AACvD,IAAA,IAAI,KAAA,EAAO,OAAO,KAAA,CAAM,GAAA,GAAM,MAAM,KAAA,GAAQ,MAAA;AAC5C,IAAA,IAAI,KAAK,OAAA,EAAS,GAAA,CAAI,IAAA,CAAK,KAAK,GAAG,OAAO,MAAA;AAC1C,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,QAAQ,IAAA,EAAiD;AAC7D,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,SAAO,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA;AACrD,IAAA,MAAM,YAAY,IAAA,CAAK,OAAA,EAAS,IAAI,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,MAAS,IACtE,MAAM,OAAA,CAAQ,KAAK,IAAA,EAAM,IAAA,CAAK,KAAK,UAAU,CAAA;AACjD,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AAChC,MAAA,MAAM,QAAQ,WAAA,CAAe,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,KAAK,MAAM,CAAA;AACzD,MAAA,OAAO,QAAS,KAAA,CAAM,GAAA,GAAM,MAAM,KAAA,GAAQ,MAAA,GAAa,UAAU,CAAC,CAAA;AAAA,IACpE,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,mBAAA,CAAoB,SAAA,EAAmB,IAAA,EAAqC;AAChF,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,qBAAA,CAAsB,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,EAAK,SAAA,EAAW,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA;AAC5G,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,EAAQ,CAAA,KAAM,WAAA,CAAe,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,MAAA,EAAe,MAAA,EAAW,EAAE,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA,EAAE,EAAG,SAAS,CAAC,CAAA;AAAA,EACvK;AAAA,EAEA,MAAM,MAAA,CAAO,KAAA,EAA8C,KAAA,EAA8B;AACvF,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,IAAA,MAAM,OAAO,MAAM,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,GAAA,EAAK,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA,EAAQ,KAAK,OAAO,CAAA,GAAI,SAAY,KAAK,CAAA;AAC1H,IAAA,OAAO,WAAA,CAAe,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,IAAA,EAAa,KAAA,EAAO,KAAK,CAAA;AAAA,EAClG;AAAA,EAEA,MAAM,eAAA,CAAgB,SAAA,EAAmB,KAAA,EAA8C,KAAA,EAA8B;AACnH,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,IAAA,MAAM,OAAO,MAAM,QAAA,CAAS,KAAK,IAAA,EAAM,IAAA,CAAK,KAAK,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,KAAK,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA,GAAY,OAAO,SAAS,CAAA;AACrI,IAAA,OAAO,WAAA,CAAe,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,IAAA,EAAa,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AAAA,EAC7G;AAAA,EAEA,MAAM,MAAM,KAAA,EAA+D;AACzE,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,KAAK,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA,SAAU,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AAChG,IAAA,MAAM,OAAO,MAAM,QAAA,CAAS,KAAK,IAAA,EAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AACtD,IAAA,OAAO,WAAA,CAAe,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,IAAA,EAAa,MAAA,EAAW,KAAK,CAAA,CAAE,MAAA;AAAA,EACxG;AAAA,EAEA,MAAM,cAAA,CAAe,SAAA,EAAmB,KAAA,EAA+D;AACrG,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,UAAU,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,OAAO,SAAS,CAAA;AAC3G,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,MAAA,EAAW,SAAS,CAAA;AAC5E,IAAA,OAAO,WAAA,CAAe,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,IAAA,EAAa,MAAA,EAAW,KAAA,EAAO,SAAS,CAAA,CAAE,MAAA;AAAA,EACnH;AAAA,EAEA,MAAM,GAAA,CAAI,KAAA,EAAU,IAAA,EAA0C;AAC5D,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AACjD,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA;AACzC,IAAA,IAAI,IAAA,CAAK,UAAU,iBAAA,EAAmB;AACpC,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAQ,GAAA,CAAI,WAAW,IAAA,CAAK,KAAA,EAAO,GAAG,CAAC,CAAA;AAC7D,MAAA,IAAI,QAAA,EAAU,IAAA,KAAS,KAAA,IAAS,CAAC,UAAU,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,sCAAsC,mBAAmB,CAAA;AAAA,IAC3J;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA;AAC3E,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,CAAA;AAC3E,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,CAAQ,MAAA,EAAa,KAAA,EAA+C;AACxE,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAK,CAAM,CAAA;AAC3E,IAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,CAAA,KAAA,KAAS,aAAa,IAAA,CAAK,GAAA,EAAK,KAAK,CAAC,CAAA;AAC9D,IAAA,IAAI,IAAA,CAAK,UAAU,iBAAA,EAAmB;AACpC,MAAA,MAAM,IAAA,uBAAW,GAAA,EAAqB;AACtC,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACvB,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,GAAG,GAAG,QAAA,GAAW,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,IAAI,CAAA;AAC1E,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,QAAA,EAAU,IAAA,KAAS,KAAA,GAAQ,SAAS,KAAA,GAAQ,MAAA;AAC5F,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,CAAC,SAAA,CAAU,OAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,sCAAsC,mBAAmB,CAAA;AAC9I,QAAA,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,KAAK,KAAA,EAAO,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,SACrH,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,OAAO,GAAA,CAAI,CAAA,KAAA,MAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA;AAC7F,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,GAAA,EAA0D;AACrE,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI,IAAA,CAAK,UAAU,iBAAA,EAAmB,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,wCAAwC,mBAAmB,CAAA;AAC7H,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,MAAA;AACnC,IAAA,MAAM,SAAS,KAAA,IAAU,GAAA;AACzB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAG;AAC1C,UAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AACzC,UAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,CAAA;AAAA,QACjF;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,MAAA;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,CAAA;AAC7E,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,MAAA,EAAkB,CAAC,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI,IAAA,CAAK,UAAU,iBAAA,EAAmB,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,wCAAwC,mBAAmB,CAAA;AAC7H,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAC5B,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAC5B,MAAA,KAAA,MAAW,QAAQ,CAAC,GAAG,KAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG;AAC1C,QAAA,IAAI,KAAK,UAAA,CAAW,MAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,MACtD;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAAA,EAChE;AAAA;AAAA,EAGQ,SAAS,GAAA,EAAqC;AACpD,IAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAW;AAC1B,QAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,uEAAuE,CAAA;AAAA,MACrG;AACA,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,IACb;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;AAUO,SAAS,iBAAiB,GAAA,EAAqB;AACpD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,GAAG,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,mBAAA,EAAqB,eAAe,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,IAAI,QAAA,CAAS,GAAG,KAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,kFAAA,EAAoF,eAAe,CAAA;AAAA,EACjI;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,EAAU;AACtC,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,+DAAA,EAAiE,eAAe,CAAA;AAAA,EAC9G;AACA,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,QAAA,KAAa,OAAA;AAC3G,EAAA,IAAI,MAAA,CAAO,aAAa,OAAA,EAAS;AAC/B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,kGAAA,EAAoG,eAAe,CAAA;AAAA,IACjJ;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,aAAa,SAAA,IAAa,MAAA,CAAO,aAAa,QAAA,IAAY,MAAA,CAAO,aAAa,MAAA,EAAQ;AAC/F,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,gCAAgC,MAAA,CAAO,QAAQ,qCAAqC,eAAe,CAAA;AAAA,EACjI;AACA,EAAA,OAAO,GAAA;AACT;AAOO,IAAM,mBAAA,GAAN,cAAkC,UAAA,CAAW;AAAA,EAClD,WAAA,CAAY,QAAA,EAAyB,OAAA,GAA6B,EAAC,EAAG;AACpE,IAAA,KAAA;AAAA,MACE,cAAA,CAAe,YAAA,CAAa,EAAE,GAAA,EAAK,gBAAA,CAAiB,QAAA,CAAS,GAAG,CAAA,EAAG,SAAA,EAAW,QAAA,CAAS,SAAA,EAAW,CAAC,CAAA;AAAA,MACnG;AAAA,KACF;AAAA,EACF;AACF;;;ACzYO,IAAM,cAAA,GAAiB;AACvB,IAAM,gBAAA,GAAmB;AAGzB,IAAM,kBAAA,GAAqB;AAyClC,IAAMG,aAAAA,GAAuC,EAAE,WAAA,EAAa,MAAA,EAAO;AAEnE,IAAM,WAAA,GAAoC,MAAA,CAAO,WAAA,CAAY,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,IAAI,CAAC,CAAC,CAAA;AAElG,IAAM,SAAA,GAAY,MAAA;AAElB,SAAS,UAAU,KAAA,EAAiC;AAClD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,cAAc,KAAK,CAAA;AAChE;AAEA,SAAS,SAAS,KAAA,EAAiC;AACjD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAa,OAAO,UAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA;AACzF;AAIA,SAAS,SAAA,CAAU,KAAc,IAAA,EAAqC;AACpE,EAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACnB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,GAAA,CAAI,SAAS,CAAA,IAAK,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,EAAG;AACjE,EAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,CAAA,EAAG,IAAI,+DAA+D,cAAc,CAAA;AAClH;AAGA,SAAS,iBAAiB,GAAA,EAA4B;AACpD,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjE,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,iCAAA,EAAmC,mBAAmB,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,QAAA,GAAW,GAAA;AACjB,EAAA,IAAI,SAAS,EAAA,KAAO,MAAA,EAAQ,OAAO,EAAE,IAAI,MAAA,EAAO;AAChD,EAAA,IAAI,OAAO,SAAS,KAAA,KAAU,QAAA,IAAY,CAAC,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,EAAG;AACtE,IAAA,MAAM,IAAI,aAAa,GAAA,EAAK,CAAA,gCAAA,EAAmC,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA,EAAI,mBAAmB,CAAA;AAAA,EAC9G;AACA,EAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,EAAA,IAAI,SAAS,EAAA,KAAO,OAAA,SAAgB,EAAE,EAAA,EAAI,SAAS,KAAA,EAAM;AACzD,EAAA,IAAI,QAAA,CAAS,OAAO,QAAA,EAAU;AAC5B,IAAA,SAAA,CAAU,QAAA,CAAS,KAAK,iBAAiB,CAAA;AACzC,IAAA,OAAO,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,EAClD;AACA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACzB,IAAA,SAAA,CAAU,QAAA,CAAS,KAAK,cAAc,CAAA;AACtC,IAAA,IAAI,QAAA,CAAS,KAAA,KAAU,IAAA,IAAQ,OAAO,QAAA,CAAS,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAClG,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,sCAAA,EAAwC,mBAAmB,CAAA;AAAA,IACzF;AACA,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,KAAK,QAAA,CAAS,GAAA,EAAK,KAAA,EAAO,QAAA,CAAS,KAAA,EAAM;AAAA,EACtE;AACA,EAAA,MAAM,IAAI,aAAa,GAAA,EAAK,CAAA,6BAAA,EAAgC,OAAO,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,mBAAmB,CAAA;AACxG;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI,OAAO,KAAA,CAAM,EAAA,KAAO,QAAA,IAAY,KAAA,CAAM,EAAA,CAAG,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,EAAA,CAAG,MAAA,GAAS,GAAA,EAAK;AAClF,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,0CAAA,EAA4C,gBAAgB,CAAA;AAAA,EAC1F;AACA,EAAA,IAAI,CAAC,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,mDAAA,EAAqD,gBAAgB,CAAA;AAAA,EACnG;AACA,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,CAAM,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AACvD,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,0CAAA,EAA4C,gBAAgB,CAAA;AAAA,EAC1F;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,GAAA,EAAK,gBAAA,CAAiB,EAAE,CAAA;AACjD;AAGA,eAAe,aAAA,CAAc,IAAmB,UAAA,EAAkD;AAChG,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AACrC,EAAA,IAAI,EAAA,CAAG,KAAA,EAAO,OAAO,EAAA,CAAG,MAAM,UAAU,CAAA;AACxC,EAAA,MAAM,UAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,EAAA,CAAG,KAAA,CAAM,SAAA,CAAU,KAAK,SAAA,CAAU,MAAA,IAAU,EAAE,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,WAAA,CAAY,IAAA,EAAqB,OAAA,EAA8B,IAAA,EAAgC;AAC5G,EAAA,MAAM,GAAA,GAAM,OAAA,KAAY,UAAA,GACpB,CAAA,kGAAA,CAAA,GACA,CAAA,gEAAA,CAAA;AACJ,EAAA,OAAA,CAAQ,MAAM,KAAK,KAAA,CAAM,GAAA,EAAK,CAAC,IAAI,CAAC,GAAG,MAAA,GAAS,CAAA;AAClD;AAGA,eAAe,cAAc,EAAA,EAA0C;AACrE,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,KAAA,CAAM,wBAAwB,gBAAgB,CAAA,iBAAA,CAAA,EAAqB,CAAC,SAAS,CAAC,CAAA;AACpG,EAAA,IAAI,CAAC,KAAK,CAAC,CAAA,QAAS,IAAI,YAAA,CAAa,GAAA,EAAK,gCAAA,EAAkC,sBAAsB,CAAA;AAClG,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,0BAAA,EAA4B,gBAAgB,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1E,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,0BAAA,EAA4B,gBAAgB,CAAA;AAAA,EAC1E;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA;AACd,EAAA,IAAI,CAAC,SAAA,CAAU,KAAA,CAAM,MAAM,KAAK,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,CAAC,UAAU,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,CAAM,MAAM,CAAA,EAAG;AAC1F,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,0DAAA,EAA4D,gBAAgB,CAAA;AAAA,EAC1G;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,GAAA,EAAK,MAAM,GAAA,EAAI;AAChD;AAGA,eAAsB,gBAAgB,EAAA,EAAuC;AAC3E,EAAA,IAAI,MAAM,WAAA,CAAY,EAAA,EAAI,EAAA,CAAG,OAAA,EAAS,gBAAgB,CAAA,EAAG;AACvD,IAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,EAAE,CAAA;AACpC,IAAA,OAAO,EAAE,MAAM,SAAA,EAAW,aAAA,EAAe,MAAM,MAAA,EAAQ,GAAA,EAAK,MAAM,GAAA,EAAI;AAAA,EACxE;AACA,EAAA,IAAI,MAAM,WAAA,CAAY,EAAA,EAAI,EAAA,CAAG,OAAA,EAAS,YAAY,CAAA,EAAG;AACnD,IAAA,MAAM,OAAO,MAAM,EAAA,CAAG,KAAA,CAAM,CAAA,qBAAA,EAAwB,YAAY,CAAA,wBAAA,CAA0B,CAAA;AAC1F,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG;AACX,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAC9C,MAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA,IAAK,KAAA,CAAM,OAAA,IAAW,CAAA,EAAG;AAClG,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAA,EAAe,MAAM,OAAA,EAAQ;AAAA,MACxD;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAA,EAAe,CAAA,EAAE;AAAA,EAC5C;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,KAAA;AAAA,IACtB,EAAA,CAAG,OAAA,KAAY,UAAA,GACX,CAAA,8EAAA,CAAA,GACA,CAAA,mDAAA;AAAA,GACN;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAA0B,IAAA,CAAK,WAAW,WAAW,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AACrG,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,QAAQ,CAAC,QAAA,CAAS,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAA,EAAM,WAAU,GAAI,OAAA;AAChG;AAIA,eAAsB,cAAA,CAAe,IAAc,aAAA,EAAsC;AACvF,EAAA,MAAM,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AACjC,IAAA,MAAM,EAAA,CAAG,IAAA,CAAK,CAAA,4BAAA,EAA+B,gBAAgB,CAAA,iDAAA,CAAmD,CAAA;AAChH,IAAA,MAAM,EAAA,CAAG,IAAA;AAAA,MACP,+BAA+B,cAAc,CAAA,yHAAA;AAAA,KAE/C;AACA,IAAA,MAAM,EAAA,CAAG,IAAA;AAAA,MACP,CAAA,4BAAA,EAA+B,cAAc,CAAA,UAAA,EAAa,cAAc,CAAA,gBAAA;AAAA,KAC1E;AACA,IAAA,MAAM,EAAA,CAAG,IAAA;AAAA,MACP,gBAAgB,gBAAgB,CAAA,+DAAA,CAAA;AAAA,MAChC,CAAC,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,EAAE,QAAQ,aAAA,EAAe,GAAA,EAAK,CAAA,EAA0B,CAAC;AAAA,KACtF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,eAAe,QAAA,EAAgC;AACtD,EAAA,IAAI,SAAS,EAAA,KAAO,KAAA,EAAO,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAGzD,EAAA,MAAM,UAAU,aAAA,CAAc,QAAA,CAAS,OAAOA,aAAAA,CAAa,QAAA,CAAS,KAAK,CAAC,CAAA;AAC1E,EAAA,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,GAAG,CAAC,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,YAAY,OAAO,CAAA,CAAA,CAAA;AACvH;AAGA,SAAS,eAAe,IAAA,EAA6B;AACnD,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,+BAAA,EAAiC,mBAAmB,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,gCAAA,EAAkC,mBAAmB,CAAA;AAAA,EACnF;AACA,EAAA,MAAM,QAAA,GAAW,iBAAiB,MAAM,CAAA;AACxC,EAAA,IAAI,QAAA,CAAS,EAAA,KAAO,KAAA,EAAO,OAAO,QAAA;AAClC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,KAAA,EAAO,aAAA,CAAc,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAGA,aAAAA,CAAa,QAAA,CAAS,KAAK,CAAC;AAAA,GACnF;AACF;AAkBA,eAAsB,cAAA,CACpB,EAAA,EACA,OAAA,EACA,IAAA,GAA8B,EAAC,EACd;AACjB,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AACjC,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,aAAA,CAAc,KAAK,CAAA;AAChD,EAAA,OAAO,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AAClC,IAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,EAAE,CAAA;AACpC,IAAA,IAAI,KAAK,YAAA,KAAiB,MAAA,IAAa,KAAA,CAAM,MAAA,KAAW,KAAK,YAAA,EAAc;AACzE,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,GAAA;AAAA,QACA,CAAA,iCAAA,EAAoC,IAAA,CAAK,YAAY,CAAA,KAAA,EAAQ,MAAM,MAAM,CAAA,+CAAA,CAAA;AAAA,QACzE;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,CAAC,UAAU,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,EAAA,CAAI,CAAA;AACvD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,GAAA,EAAK;AAC7C,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,GAAG,CAAA;AACvC,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,KAAA;AAAA,QACpB,CAAA,qBAAA,EAAwB,cAAc,CAAA,oBAAA,EAAuB,KAAA,CAAM,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,QAC5F;AAAA,OACF;AACA,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM,OAAA,CAAQ,IAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,MAAM,aAA6B,EAAC;AACpC,IAAA,IAAI,MAAM,KAAA,CAAM,GAAA;AAChB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,QAAQ,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,EAAE,IAAI,CAAA,EAAG;AAClC,MAAA,GAAA,IAAO,CAAA;AACP,MAAA,SAAA,IAAa,CAAA;AACb,MAAA,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,QAAA,EAAU,GAAA,KAAQ;AACnC,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,GAAA,EACE,gBAAgB,cAAc,CAAA,+FAAA,CAAA;AAAA,UAEhC,MAAA,EAAQ,CAAC,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,EAAA,EAAI,cAAA,CAAe,QAAQ,CAAC;AAAA,SAC5E,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,IAAmB,KAAA,CAAM,MAAA;AACjD,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,GAAA,EAAK,WAAW,gBAAgB,CAAA,iCAAA,CAAA;AAAA,MAChC,MAAA,EAAQ,CAAC,IAAA,CAAK,SAAA,CAAU,EAAE,QAAQ,UAAA,EAAY,GAAA,EAA4B,CAAA,EAAG,SAAS;AAAA,KACvF,CAAA;AACD,IAAA,MAAM,aAAA,CAAc,IAAI,UAAU,CAAA;AAClC,IAAA,OAAO,SAAA;AAAA,EACT,CAAC,CAAA;AACH;AASA,eAAsB,YAAA,CAAa,EAAA,EAAc,QAAA,EAAkB,KAAA,EAAwC;AACzG,EAAA,IAAI,CAAC,SAAA,CAAU,QAAQ,CAAA,IAAK,WAAW,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,yDAAA,EAA2D,iBAAiB,CAAA;AAAA,EAC1G;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,UAAU,CAAA;AACnE,EAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,KAAA;AAAA,IACvB,kDAAkD,cAAc,CAAA,6CAAA,CAAA;AAAA,IAChE,CAAC,UAAU,OAAO;AAAA,GACpB;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AAChC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA,IAAK,MAAM,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,iDAAA,EAAmD,cAAc,CAAA;AAAA,IAC/F;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAC/B,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,KAAA;AAAA,IACpB,CAAA,iDAAA,EAAoD,cAAc,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,uBAAA,CAAA;AAAA,IACrH;AAAA,GACF;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,EAAA,KAAO;AAC3B,IAAA,MAAM,OAAO,GAAA,CAAI,KAAA;AACjB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAC1B,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,CAAC,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA,IAAK,GAAA,GAAM,CAAA,IACpF,CAAC,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA,IAAK,GAAA,GAAM,CAAA,IAAK,CAAC,MAAA,CAAO,aAAA,CAAc,IAAI,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG;AACrF,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,CAAA,YAAA,EAAe,EAAE,wBAAwB,cAAc,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,EAAA,EAAI,MAAM,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAE;AAAA,EACxE,CAAC,CAAA;AACH;AAUA,eAAsB,cAAA,CAAe,EAAA,EAAc,OAAA,EAAsB,eAAA,EAAwC;AAC/G,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,uDAAuD,gBAAgB,CAAA;AAC7H,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,aAAA,CAAc,KAAK,CAAA;AAChD,EAAA,MAAM,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AACjC,IAAA,MAAM,cAAc,EAAE,CAAA;AACtB,IAAA,MAAM,EAAA,CAAG,IAAA;AAAA,MACP,+BAA+B,kBAAkB,CAAA,yHAAA;AAAA,KAEnD;AACA,IAAA,MAAM,GAAG,IAAA,CAAK,CAAA,aAAA,EAAgB,kBAAkB,CAAA,yFAAA,EAA4F,cAAc,CAAA,CAAA,CAAG,CAAA;AAC7J,IAAA,MAAM,EAAA,CAAG,IAAA,CAAK,CAAA,aAAA,EAAgB,cAAc,CAAA,CAAA,CAAG,CAAA;AAC/C,IAAA,MAAM,aAA6B,EAAC;AACpC,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,GAAA,IAAO,CAAA;AACP,MAAA,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,QAAA,EAAU,GAAA,KAAQ;AACnC,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,GAAA,EACE,gBAAgB,cAAc,CAAA,+FAAA,CAAA;AAAA,UAEhC,MAAA,EAAQ,CAAC,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,EAAA,EAAI,cAAA,CAAe,QAAQ,CAAC;AAAA,SAC5E,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AACA,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,GAAA,EAAK,WAAW,gBAAgB,CAAA,iCAAA,CAAA;AAAA,MAChC,MAAA,EAAQ,CAAC,IAAA,CAAK,SAAA,CAAU,EAAE,QAAQ,eAAA,EAAiB,GAAA,EAA4B,CAAA,EAAG,SAAS;AAAA,KAC5F,CAAA;AACD,IAAA,MAAM,aAAA,CAAc,IAAI,UAAU,CAAA;AAAA,EACpC,CAAC,CAAA;AACH;AAaA,eAAsB,eAAe,EAAA,EAAoC;AACvE,EAAA,MAAM,OAAO,MAAM,EAAA,CAAG,KAAA,CAAM,CAAA,kCAAA,EAAqC,cAAc,CAAA,uBAAA,CAAyB,CAAA;AACxG,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA,IAAK,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA,IAAK,GAAA,GAAM,KAAK,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AAClH,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,iCAAA,EAAmC,cAAc,CAAA;AAAA,IAC/E;AACA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,gCAAA,EAAkC,cAAc,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1E,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,gCAAA,EAAkC,cAAc,CAAA;AAAA,IAC9E;AACA,IAAA,MAAM,QAAA,GAAW,MAAA;AACjB,IAAA,IAAI,OAAO,QAAA,CAAS,EAAA,KAAO,YAAY,OAAO,QAAA,CAAS,UAAU,QAAA,EAAU;AACzE,MAAA,MAAM,IAAI,YAAA,CAAa,GAAA,EAAK,oCAAA,EAAsC,cAAc,CAAA;AAAA,IAClF;AACA,IAAA,OAAO;AAAA,MACL,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,OAAO,QAAA,CAAS,KAAA,KAAU,MAAA,IAAa,QAAA,CAAS,UAAU,IAAA,GACtD,MAAA,GACA,aAAA,CAAc,IAAA,CAAK,UAAU,QAAA,CAAS,KAAK,GAAGA,aAAAA,CAAa,QAAA,CAAS,KAAK,CAAC;AAAA,KAChF;AAAA,EACF,CAAC,CAAA;AACH;AASA,eAAsB,cAAA,CAAe,IAAc,KAAA,EAAmC;AACpF,EAAA,IAAI,CAAE,MAAM,WAAA,CAAY,EAAA,EAAI,GAAG,OAAA,EAAS,KAAK,CAAA,EAAI,OAAO,EAAC;AACzD,EAAA,MAAM,OAAO,MAAM,EAAA,CAAG,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,CAAA,CAAA,CAAG,CAAA;AAC3D,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,aAAA,CAAc,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAGA,aAAAA,CAAa,KAAK,CAAC,CAAC,CAAA;AAC/E","file":"index.mjs","sourcesContent":["/**\n * Connection contracts + a generic libsql adapter. The adapter takes a\n * *structural* client so the browser passes @libsql/client/web and the server\n * passes @libsql/client (node) — this module never imports either, keeping\n * the browser graph free of native drivers.\n *\n * All operations are serialized through one promise chain: the underlying\n * client shares a single connection, so concurrent transactions/reads could\n * otherwise interleave on it. Transactions run on a transaction-owned\n * connection (libsql interactive transaction), so writes inside a transaction\n * commit or roll back atomically and are not visible outside it.\n */\n\nimport type { Client } from '@libsql/client';\n\nimport { StorageError } from './errors';\nexport type SqlValue = string | number | null; // booleans bound as 1/0 by callers\nexport type SqlRow = Record<string, unknown>;\n\nexport interface SqlStatement { sql: string; params?: SqlValue[] }\nexport interface SqlConnection {\n query(sql: string, params?: SqlValue[]): Promise<SqlRow[]>;\n exec(sql: string, params?: SqlValue[]): Promise<void>;\n batch?(statements: SqlStatement[]): Promise<SqlRow[][]>;\n}\n\nexport interface Database extends SqlConnection {\n readonly dialect: 'sqlite' | 'postgres';\n transaction<T>(fn: (tx: SqlConnection) => Promise<T>): Promise<T>;\n close(): Promise<void>;\n}\n\n/** Minimal surface used from a libsql client (node or web build) — the real\n * @libsql/client types, type-only so the browser graph stays driver-free. */\nexport type LibsqlClient = Pick<Client, 'execute' | 'transaction' | 'close'>;\n\nfunction libsqlRows(result: { rows: ArrayLike<Record<string, unknown>> }): SqlRow[] {\n return result.rows as unknown as SqlRow[];\n}\n\n/** Wrap a libsql client (node or web build) into the shared Database surface. */\nexport function libsqlDatabase(client: LibsqlClient): Database {\n let chain: Promise<unknown> = Promise.resolve();\n const serialize = <T>(fn: () => Promise<T>): Promise<T> => {\n const next = chain.then(fn, fn);\n chain = next.then(() => undefined, () => undefined);\n return next;\n };\n return {\n dialect: 'sqlite',\n query: (sql, params = []) => serialize(() => client.execute({ sql, args: params }).then(libsqlRows)),\n exec: async (sql, params = []) => {\n await serialize(() => client.execute({ sql, args: params }));\n },\n transaction<T>(fn: (tx: SqlConnection) => Promise<T>): Promise<T> {\n return serialize(async () => {\n const tx = await client.transaction('write');\n try {\n const txConn: SqlConnection = {\n query: (sql, params = []) => tx.execute({ sql, args: params }).then(libsqlRows),\n exec: async (sql, params = []) => {\n await tx.execute({ sql, args: params });\n },\n batch: async (statements) => (await tx.batch(statements.map(({ sql, params = [] }) => ({ sql, args: params })))).map(libsqlRows),\n };\n const result = await fn(txConn);\n await tx.commit();\n return result;\n } catch (err) {\n try {\n await tx.rollback();\n } catch {\n // transaction already closed by the failed statement\n }\n const message = err instanceof Error ? err.message : String(err);\n for (const code of ['revision_conflict', 'transaction_conflict', 'invalid_session_pin']) {\n if (message.includes(code)) throw new StorageError(409, message, code);\n }\n throw err;\n } finally {\n tx.close();\n }\n });\n },\n close: async () => {\n await chain;\n client.close();\n },\n };\n}\n","/**\n * Row codec for the SQL `data` column. Plain JSON.stringify destroys\n * ArrayBuffer values ({}); attachment rows carry raw blobs, so encoding tags\n * the declared binary field and decoding revives it.\n *\n * Collision safety: tagging applies ONLY to the declared binary field of the\n * declared store (attachments.data) — arbitrary rows (meta, notes, …) are\n * plain JSON in both directions, so authored {$binary:…}-shaped objects\n * anywhere else round-trip byte-for-byte. Within attachments.data the value\n * is typed `ArrayBuffer | string`; strings pass through, and only the exact\n * two-key tag revives.\n */\n\nconst TAG = '$binary';\nconst LEN = '$bytes';\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n const CHUNK = 0x8000; // String.fromCharCode.apply arg ceiling\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length); // exact-length buffer: .buffer IS the decoded ArrayBuffer\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Tag shape: exactly { $binary: base64, $bytes: length }. */\nfunction reviveBinary(value: unknown): unknown {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(TAG) || !keys.includes(LEN)) return value;\n const tag = value as Record<string, unknown>;\n if (typeof tag[TAG] !== 'string' || typeof tag[LEN] !== 'number') return value;\n const bytes = base64ToBytes(tag[TAG]);\n if (bytes.length !== tag[LEN]) {\n throw new Error(`corrupt binary cell: declared ${tag[LEN]} bytes, decoded ${bytes.length}`);\n }\n return bytes.buffer;\n}\n\n/** Serialize a row; when `binaryField` is set and holds an ArrayBuffer, it is\n * replaced by the lossless tag (shallow copy — the input row is untouched). */\nconst canonicalJson = (_key: string, value: unknown): unknown => {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n return Object.fromEntries(Object.keys(value).sort().map(key => [key, Reflect.get(value, key)]));\n};\nexport function encodeRowJson(value: unknown, binaryField?: string): string {\n if (binaryField && value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const row = value as Record<string, unknown>;\n const data = row[binaryField];\n if (data instanceof ArrayBuffer) {\n const bytes = new Uint8Array(data);\n return JSON.stringify({ ...row, [binaryField]: { [TAG]: bytesToBase64(bytes), [LEN]: bytes.length } }, canonicalJson);\n }\n }\n return JSON.stringify(value, canonicalJson);\n}\n\n/** Parse a row; when `binaryField` is set, a tagged value there revives as an\n * ArrayBuffer. Every other value — including tag-shaped data in other fields\n * or stores — is returned exactly as authored. */\nexport function decodeRowJson<T = unknown>(text: string, binaryField?: string): T {\n const row = JSON.parse(text) as unknown;\n if (binaryField && row !== null && typeof row === 'object' && !Array.isArray(row)) {\n const record = row as Record<string, unknown>;\n const revived = reviveBinary(record[binaryField]);\n if (revived !== record[binaryField]) record[binaryField] = revived;\n }\n return row as T;\n}\n","/**\n * Schema-driven store operations: IDB-style stores persisted into SQL tables\n * (one per store, extracted key/index columns + full JSON in `data`). The\n * schema derives entirely from STORE_DEFS / COLUMN_TYPES; JSON payloads stay\n * the source of truth. Shared by the API server and the browser\n * BrowserTursoStorage/SqlStorage backends.\n */\nimport {\n COLUMN_TYPES,\n DB_VERSION,\n STORE_DEFS,\n type IndexDef,\n type StorageColumnType,\n type StoreDef,\n} from '../schema';\nimport {\n compareKeys,\n extractKeyPart,\n isRange,\n keyInRange,\n type KeyDTO,\n type RangeDTO,\n type Scalar,\n} from '../wire';\nimport type { Database, SqlConnection, SqlRow, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport type { StoreName } from '../contract';\nimport { decodeRowJson, encodeRowJson } from './codec';\nimport { validateStorageRow } from '../validation';\n\nexport const SCHEMA_TABLE = '_wodwiki_schema';\nconst SCHEMA_KEY = 'schema';\n\n/** Stores whose rows carry a raw binary field the codec must preserve. */\nconst BINARY_FIELD: Partial<Record<StoreName, string>> = { attachments: 'data' };\n\nconst binaryFieldOf = (def: StoreDef): string | undefined => BINARY_FIELD[def.name];\n\nexport function storeDefinition(name: string): StoreDef {\n const def = STORE_DEFS.find((d) => d.name === name);\n if (!def) throw new StorageError(404, `unknown store: ${name}`);\n return def;\n}\n\nfunction indexDefinition(def: StoreDef, indexName: string): IndexDef {\n const idx = def.indexes.find((i) => i.name === indexName);\n if (!idx) throw new StorageError(404, `unknown index: ${def.name}.${indexName}`);\n return idx;\n}\n\n/** ASCII identifier chars only; everything else → '_' (safe inside quotes). */\nfunction sanitize(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, '_');\n}\n\nconst indexCol = (indexName: string, part: number): string => `i_${sanitize(indexName)}_${part}`;\n\nfunction keyCols(def: StoreDef): string[] {\n return def.keyPath.map((_, i) => `k${i}`);\n}\n\nconst junctionTable = (def: StoreDef, idx: IndexDef): string => `${def.name}__${sanitize(idx.name)}`;\n\nconst multiEntryIndex = (def: StoreDef): IndexDef | undefined => def.indexes.find((i) => i.multiEntry);\n\nfunction pathType(def: StoreDef, path: string): StorageColumnType {\n return COLUMN_TYPES[def.name][path] ?? 'text';\n}\n\n/** SQLite store columns stay untyped (BLOB affinity) so values keep their\n * storage class and IDB ordering; PostgreSQL needs concrete types. Numbers\n * and booleans bind as float8 (booleans as 0/1), so both get DOUBLE\n * PRECISION. Text uses COLLATE \"C\" so PG ordering matches SQLite bytes. */\nfunction colSql(dialect: 'sqlite' | 'postgres', type: StorageColumnType): string {\n if (dialect === 'sqlite') return '';\n return type === 'text' ? ' TEXT COLLATE \"C\"' : ' DOUBLE PRECISION';\n}\n\n/** Runtime scalar → bound SQL value: null→NULL, bool→1/0, number/string as-is,\n * anything else → JSON text. */\nfunction toSqlScalar(v: unknown): SqlValue {\n if (v === null || v === undefined) return null;\n if (typeof v === 'boolean') return v ? 1 : 0;\n if (typeof v === 'number' || typeof v === 'string') return v;\n return JSON.stringify(v);\n}\n\nfunction validateKey(key: unknown): asserts key is KeyDTO {\n const scalar = (v: unknown): v is Scalar =>\n typeof v === 'string' || (typeof v === 'number' && Number.isFinite(v));\n if (!scalar(key) && !(Array.isArray(key) && key.length > 0 && key.every(scalar))) {\n throw new StorageError(400, 'key must be a string, finite number, or non-empty scalar tuple');\n }\n}\n\nfunction validateRange(range: RangeDTO | undefined): void {\n if (range === undefined) return;\n if (range === null || typeof range !== 'object' || Array.isArray(range)) {\n throw new StorageError(400, 'range must be an object');\n }\n for (const key of [range.only, range.lower, range.upper]) {\n if (key !== undefined) validateKey(key);\n }\n for (const open of [range.lowerOpen, range.upperOpen]) {\n if (open !== undefined && typeof open !== 'boolean') {\n throw new StorageError(400, 'range open flags must be boolean');\n }\n }\n}\n\nfunction toParts(key: KeyDTO): Scalar[] {\n validateKey(key);\n return Array.isArray(key) ? key : [key];\n}\n\n/** Reads a dotted path whose leaf must be an array (multiEntry values).\n * Shared extractKeyPart deliberately rejects array leaves, so the last hop\n * is traversed here over the parsed JSON row. */\nfunction arrayPart(value: unknown, dotted: string): unknown[] | undefined {\n let cur: unknown = value;\n for (const part of dotted.split('.')) {\n if (cur === null || typeof cur !== 'object') return undefined;\n // Traversal over parsed JSON: only plain rows are ever stored.\n const row = cur as Record<string, unknown>;\n cur = row[part];\n }\n return Array.isArray(cur) ? cur : undefined;\n}\n\n/** Primary-key extraction at the trust boundary: a missing keyPath part is\n * required-input validation → 400 (not an internal error). */\nfunction requireKey(def: StoreDef, value: unknown): KeyDTO {\n const parts = def.keyPath.map((p) => extractKeyPart(value, p));\n for (const [i, part] of parts.entries()) {\n if (part === undefined) {\n throw new StorageError(400, `keyPath part '${def.keyPath[i]}' missing on ${def.name} value`);\n }\n }\n const key = parts as Scalar[];\n return key.length === 1 ? key[0] : key;\n}\n\n/** Scalar bounds compile to the first key column; tuple bounds compile\n * part-wise when their arity fits the target columns; anything else returns\n * null → caller falls back to a scan + shared keyInRange filter. Returns the WHERE\n * clause ('' when unfiltered) and pushes bound params in order. */\nfunction rangeWhere(cols: string[], range: RangeDTO | undefined, params: SqlValue[]): string | null {\n if (!range) return '';\n if (range.only !== undefined) {\n const parts = toParts(range.only);\n if (parts.length > cols.length) return null;\n const clauses = parts.map((p, i) => {\n params.push(toSqlScalar(p));\n return `\"${cols[i]}\" = ?`;\n });\n return ` WHERE ${clauses.join(' AND ')}`;\n }\n const bounds: Array<[Scalar[], string]> = [];\n if (range.lower !== undefined && range.lower !== null) {\n bounds.push([toParts(range.lower), range.lowerOpen ? '>' : '>=']);\n }\n if (range.upper !== undefined && range.upper !== null) {\n bounds.push([toParts(range.upper), range.upperOpen ? '<' : '<=']);\n }\n const clauses: string[] = [];\n for (const [parts, op] of bounds) {\n if (parts.length > cols.length) return null;\n if (parts.length === 1) {\n params.push(toSqlScalar(parts[0]));\n clauses.push(`\"${cols[0]}\" ${op} ?`);\n } else {\n // Tuple compare: (c0,c1) >= (p0,p1) ⇔ c0 > p0 OR (c0 = p0 AND c1 >= p1)\n const ors = parts.map((p, i) => {\n const eqs: string[] = [];\n for (let j = 0; j < i; j++) {\n params.push(toSqlScalar(parts[j]));\n eqs.push(`\"${cols[j]}\" = ?`);\n }\n params.push(toSqlScalar(p));\n const cmpOp = i === parts.length - 1 ? op : op[0];\n eqs.push(`\"${cols[i]}\" ${cmpOp} ?`);\n return `(${eqs.join(' AND ')})`;\n });\n clauses.push(`(${ors.join(' OR ')})`);\n }\n }\n return clauses.length ? ` WHERE ${clauses.join(' AND ')}` : '';\n}\n\nfunction clampLimit(count: number | undefined): number | undefined {\n if (count === undefined) return undefined;\n if (typeof count !== 'number' || !Number.isFinite(count)) {\n throw new StorageError(400, `invalid count: ${String(count)}`);\n }\n return Math.max(0, Math.floor(count));\n}\n\nconst limitClause = (count: number | undefined): string =>\n count === undefined ? '' : ` LIMIT ${clampLimit(count)}`;\n\nfunction parseRows(rows: SqlRow[], binaryField?: string): unknown[] {\n return rows.map((r) => decodeRowJson(r.data as string, binaryField));\n}\n\n/** Full-table scan + in-memory IDB filtering/ordering via the shared wire\n * helpers. Only reachable for range shapes the column compile cannot express\n * (arity mismatches). Rows missing an index field are NOT in the index\n * (IDB semantics) and are skipped; a missing primary key is a 400. */\nasync function scanRows(\n conn: SqlConnection,\n def: StoreDef,\n idx: IndexDef | undefined,\n range: RangeDTO | undefined,\n limit: number | undefined,\n): Promise<unknown[]> {\n const rows = await conn.query(`SELECT \"data\" FROM \"${def.name}\"`);\n const keyed: Array<[KeyDTO, unknown]> = [];\n for (const row of rows) {\n const value = decodeRowJson(row.data as string, binaryFieldOf(def));\n if (idx) {\n const parts = idx.keyPath.map((p) => extractKeyPart(value, p));\n if (!parts.every((p): p is Scalar => p !== undefined)) continue;\n const key = parts.length === 1 ? parts[0] : parts;\n if (range && !keyInRange(key, range)) continue;\n keyed.push([key, value]);\n } else {\n const key = requireKey(def, value);\n if (range && !keyInRange(key, range)) continue;\n keyed.push([key, value]);\n }\n }\n keyed.sort((a, b) => compareKeys(a[0], b[0]));\n const out = keyed.map(([, v]) => v);\n return limit === undefined ? out : out.slice(0, limit);\n}\n\nexport async function getRow(conn: SqlConnection, def: StoreDef, key: KeyDTO): Promise<unknown | undefined> {\n const parts = toParts(key);\n if (parts.length !== def.keyPath.length) {\n throw new StorageError(400, `key arity ${parts.length} != keyPath arity ${def.keyPath.length} for ${def.name}`);\n }\n const cond = keyCols(def).map((c) => `\"${c}\" = ?`).join(' AND ');\n const rows = await conn.query(\n `SELECT \"data\" FROM \"${def.name}\" WHERE ${cond}`,\n parts.map(toSqlScalar),\n );\n return rows[0] ? decodeRowJson(rows[0].data as string, binaryFieldOf(def)) : undefined;\n}\n\nexport async function getRows(conn: SqlConnection, def: StoreDef, keys: KeyDTO[]): Promise<(unknown | undefined)[]> {\n const found = new Map<string, unknown>();\n // Batch in chunks of 50 to respect SQLite/D1 SQLITE_LIMIT_EXPR_DEPTH (100) on chained OR expressions\n for (const part of chunks(keys, 50)) {\n const params: SqlValue[] = [];\n const conditions = part.map(key => {\n const parts = toParts(key);\n if (parts.length !== def.keyPath.length) throw new StorageError(400, 'invalid compound key arity');\n params.push(...parts.map(toSqlScalar));\n return `(${keyCols(def).map(col => `\"${col}\" = ?`).join(' AND ')})`;\n });\n for (const row of await conn.query(`SELECT \"data\" FROM \"${def.name}\" WHERE ${conditions.join(' OR ')}`, params)) {\n const value = decodeRowJson(String(row.data), binaryFieldOf(def));\n found.set(JSON.stringify(requireKey(def, value)), value);\n }\n }\n return keys.map(key => found.get(JSON.stringify(key)));\n}\n\nexport async function listRowsFromIndexMany(conn: SqlConnection, def: StoreDef, indexName: string, keys: KeyDTO[]): Promise<unknown[][]> {\n const idx = indexDefinition(def, indexName);\n if (idx.multiEntry) {\n const out: unknown[][] = [];\n for (const key of keys) out.push(await listRows(conn, def, { only: key }, undefined, indexName));\n return out;\n }\n const found = new Map<string, unknown[]>();\n // Batch in chunks of 50 to respect SQLite/D1 SQLITE_LIMIT_EXPR_DEPTH (100) on chained OR expressions\n for (const part of chunks(keys, 50)) {\n const params: SqlValue[] = [];\n const conditions = part.map(key => {\n const parts = toParts(key);\n if (parts.length !== idx.keyPath.length) throw new StorageError(400, 'invalid index key arity');\n params.push(...parts.map(toSqlScalar));\n return `(${parts.map((_, i) => `\"${indexCol(idx.name, i)}\" = ?`).join(' AND ')})`;\n });\n for (const row of await conn.query(`SELECT \"data\" FROM \"${def.name}\" WHERE ${conditions.join(' OR ')} ORDER BY ${keyCols(def).map(col => `\"${col}\"`).join(', ')}`, params)) {\n const value = decodeRowJson(String(row.data), binaryFieldOf(def));\n const parts = idx.keyPath.map(path => extractKeyPart(value, path));\n const key = JSON.stringify(parts.length === 1 ? parts[0] : parts);\n const bucket = found.get(key);\n if (bucket) bucket.push(value); else found.set(key, [value]);\n }\n }\n return keys.map(key => found.get(JSON.stringify(key)) ?? []);\n}\n\nexport async function listRows(\n conn: SqlConnection,\n def: StoreDef,\n range?: RangeDTO,\n count?: number,\n indexName?: string,\n): Promise<unknown[]> {\n validateRange(range);\n const idx = indexName ? indexDefinition(def, indexName) : undefined;\n const binaryField = binaryFieldOf(def);\n if (idx?.multiEntry) {\n // JSON encoding preserves numeric/string equality in both SQL dialects.\n const only = range?.only;\n if (only === undefined || typeof only === 'object') {\n throw new StorageError(400, `multi-entry index ${def.name}.${idx.name} supports exact-match queries only`);\n }\n const joinOn = keyCols(def).map((c) => `j.\"${c}\" = e.\"${c}\"`).join(' AND ');\n // IDB multi-entry ordering: junction value first, then the primary key.\n const order = ['j.\"v\"', ...keyCols(def).map((c) => `j.\"${c}\"`)].join(', ');\n const rows = await conn.query(\n `SELECT e.\"data\" AS \"data\" FROM \"${def.name}\" e JOIN \"${junctionTable(def, idx)}\" j ON ${joinOn}` +\n ` WHERE j.\"v\" = ? ORDER BY ${order}${limitClause(count)}`,\n [JSON.stringify(only)],\n );\n return parseRows(rows, binaryField);\n }\n const cols = idx ? idx.keyPath.map((_, part) => indexCol(idx.name, part)) : keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, range, params);\n if (where === null) return scanRows(conn, def, idx, range, clampLimit(count));\n // IDB: rows whose index key is missing/invalid are not in the index —\n // exclude them even from unfiltered listings (SQL NULL comparison alone\n // only drops them from bounded ranges). NULLS never reach ORDER BY.\n const notNull = cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ');\n const cond = where ? `${where} AND ${notNull}` : ` WHERE ${notNull}`;\n // IDB orders index results by (index key, primary key).\n const keyNames = keyCols(def).filter((k) => !cols.includes(k));\n const order = ` ORDER BY ${[...cols, ...keyNames].map((c) => `\"${c}\"`).join(', ')}`;\n const rows = await conn.query(\n `SELECT \"data\" FROM \"${def.name}\"${cond}${order}${limitClause(count)}`,\n params,\n );\n return parseRows(rows, binaryField);\n}\n\nexport async function countRows(\n conn: SqlConnection,\n def: StoreDef,\n range?: RangeDTO,\n indexName?: string,\n): Promise<number> {\n validateRange(range);\n const idx = indexName ? indexDefinition(def, indexName) : undefined;\n if (idx?.multiEntry) {\n const only = range?.only;\n if (only === undefined || typeof only === 'object') {\n throw new StorageError(400, `multi-entry index ${def.name}.${idx.name} supports exact-match queries only`);\n }\n const joinOn = keyCols(def).map((c) => `j.\"${c}\" = e.\"${c}\"`).join(' AND ');\n const rows = await conn.query(\n `SELECT COUNT(*) AS \"n\" FROM \"${def.name}\" e JOIN \"${junctionTable(def, idx)}\" j ON ${joinOn} WHERE j.\"v\" = ?`,\n [JSON.stringify(only)],\n );\n return Number(rows[0]?.n ?? 0);\n }\n const cols = idx ? idx.keyPath.map((_, part) => indexCol(idx.name, part)) : keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, range, params);\n if (where === null) {\n const all = await scanRows(conn, def, idx, range, undefined);\n return all.length;\n }\n const cond = idx ? (where ? `${where} AND ${cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ')}` : ` WHERE ${cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ')}`) : where;\n const rows = await conn.query(`SELECT COUNT(*) AS \"n\" FROM \"${def.name}\"${cond}`, params);\n return Number(rows[0]?.n ?? 0);\n}\n\n/** Bound-parameter budget per statement. SQLite ≥3.32 allows 32766; 20k\n * leaves headroom, and the row cap keeps single request bodies ≤ ~1 MB. */\nconst PARAM_BUDGET = 20000;\nconst ROW_CAP = 100;\n\nconst chunks = <T>(arr: T[], size: number): T[][] => {\n const out: T[][] = [];\n for (let i = 0; i < arr.length; i += size) out.push(arr.slice(i, i + size));\n return out;\n};\n\n/** Multi-row `INSERT … ON CONFLICT` in param-budgeted chunks. One round trip\n * per chunk over Turso instead of one per row. `cols` are internal schema\n * identifiers (never user input); `onConflict` is the full trailing clause. */\nexport async function batchInsert(\n conn: SqlConnection,\n table: string,\n cols: string[],\n rows: SqlValue[][],\n onConflict: string,\n): Promise<void> {\n if (rows.length === 0) return;\n const collist = cols.map((c) => `\"${c}\"`).join(', ');\n const tuple = `(${cols.map(() => '?').join(', ')})`;\n const per = Math.max(1, Math.min(ROW_CAP, Math.floor(PARAM_BUDGET / cols.length)));\n const statements = chunks(rows, per).map(part => ({\n sql: `INSERT INTO \"${table}\" (${collist}) VALUES ${part.map(() => tuple).join(', ')} ${onConflict}`,\n params: part.flat(),\n }));\n if (conn.batch) await conn.batch(statements);\n else for (const statement of statements) await conn.exec(statement.sql, statement.params);\n}\n\n/** Chunked `DELETE … WHERE col IN (…)` — one round trip per chunk. */\nexport async function deleteIn(conn: SqlConnection, table: string, col: string, vals: SqlValue[]): Promise<void> {\n for (const part of chunks(vals, 500)) {\n if (part.length === 0) continue;\n await conn.exec(`DELETE FROM \"${table}\" WHERE \"${col}\" IN (${part.map(() => '?').join(', ')})`, part);\n }\n}\n\nexport async function putRows(conn: SqlConnection, def: StoreDef, values: unknown[], changedKeys?: KeyDTO[]): Promise<KeyDTO[]> {\n if (values.length === 0) return [];\n for (const value of values) validateStorageRow(def.name, value);\n const keys = keyCols(def);\n const cols = [...keys];\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((_, part) => cols.push(indexCol(idx.name, part)));\n }\n cols.push('data');\n const keySet = new Set(keys);\n const updates = cols.filter((c) => !keySet.has(c)).map((c) => `\"${c}\" = excluded.\"${c}\"`).join(', ');\n const pk = keys.map((k) => `\"${k}\"`).join(', ');\n\n const rows: SqlValue[][] = [];\n const out: KeyDTO[] = [];\n const junction: SqlValue[][] = [];\n const multi = multiEntryIndex(def);\n for (const value of values) {\n const k = requireKey(def, value);\n const keyParts = toParts(k).map(toSqlScalar);\n const vals = [...keyParts];\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((path) => vals.push(toSqlScalar(extractKeyPart(value, path) ?? null)));\n }\n vals.push(encodeRowJson(value, binaryFieldOf(def)));\n rows.push(vals);\n out.push(k);\n if (multi) {\n const items = arrayPart(value, multi.keyPath[0]);\n if (Array.isArray(items)) {\n for (const item of items) junction.push([...keyParts, JSON.stringify(item)]);\n }\n }\n }\n const tuple = `(${cols.map(() => '?').join(', ')})`;\n const per = Math.max(1, Math.min(ROW_CAP, Math.floor(PARAM_BUDGET / cols.length)));\n const statements = chunks(rows, per).map(part => ({\n sql: `INSERT INTO \"${def.name}\" (${cols.map(col => `\"${col}\"`).join(', ')}) VALUES ${part.map(() => tuple).join(', ')} `\n + (def.name === 'block_revisions' ? `ON CONFLICT (${pk}) DO NOTHING` : `ON CONFLICT (${pk}) DO UPDATE SET ${updates} WHERE \"${def.name}\".\"data\" <> excluded.\"data\"`)\n + ` RETURNING ${keys.map(col => `\"${col}\"`).join(', ')}`,\n params: part.flat(),\n }));\n let returned: SqlRow[][];\n try {\n if (conn.batch) returned = await conn.batch(statements);\n else {\n returned = [];\n for (const statement of statements) returned.push(await conn.query(statement.sql, statement.params));\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n for (const code of ['revision_conflict', 'transaction_conflict', 'invalid_session_pin']) {\n if (message.includes(code)) throw new StorageError(409, message, code);\n }\n throw error;\n }\n const changed = returned.flat().map(row => {\n const parts = keys.map(col => row[col]) as Scalar[];\n return parts.length === 1 ? parts[0] : parts;\n });\n changedKeys?.push(...changed);\n if (multi) {\n const jt = junctionTable(def, multi);\n const changedSet = new Set(changed.map(key => JSON.stringify(key)));\n const deletes = values.flatMap(value => {\n const key = requireKey(def, value);\n if (!changedSet.has(JSON.stringify(key))) return [];\n const items = arrayPart(value, multi.keyPath[0]) ?? [];\n return [{ sql: `DELETE FROM \"${jt}\" WHERE ${keys.map(col => `\"${col}\" = ?`).join(' AND ')}`\n + (items.length ? ` AND \"v\" NOT IN (${items.map(() => '?').join(', ')})` : ''),\n params: [...toParts(key).map(toSqlScalar), ...items.map(item => JSON.stringify(item))] }];\n });\n if (conn.batch && deletes.length) await conn.batch(deletes);\n else for (const statement of deletes) await conn.exec(statement.sql, statement.params);\n await batchInsert(conn, jt, [...keys, 'v'], junction.filter(row => changedSet.has(JSON.stringify(keys.length === 1 ? row[0] : row.slice(0, keys.length)))), 'ON CONFLICT DO NOTHING');\n }\n return out;\n}\n\nexport async function putRow(conn: SqlConnection, def: StoreDef, value: unknown): Promise<KeyDTO> {\n return (await putRows(conn, def, [value]))[0];\n}\n\nexport async function deleteRows(conn: SqlConnection, def: StoreDef, keyOrRange: KeyDTO | RangeDTO): Promise<void> {\n if (def.name === 'block_revisions') throw new StorageError(409, 'block history may only be removed by explicit wipe', 'revision_conflict');\n const multi = multiEntryIndex(def);\n if (!isRange(keyOrRange)) {\n const parts = toParts(keyOrRange);\n if (parts.length > def.keyPath.length) {\n throw new StorageError(400, `key arity ${parts.length} > keyPath arity ${def.keyPath.length} for ${def.name}`);\n }\n const n = Math.min(parts.length, def.keyPath.length);\n const cond = keyCols(def).slice(0, n).map((c) => `\"${c}\" = ?`).join(' AND ');\n const params = parts.slice(0, n).map(toSqlScalar);\n if (multi) await conn.exec(`DELETE FROM \"${junctionTable(def, multi)}\" WHERE ${cond}`, params);\n await conn.exec(`DELETE FROM \"${def.name}\" WHERE ${cond}`, params);\n return;\n }\n validateRange(keyOrRange);\n const cols = keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, keyOrRange, params);\n if (where === null) {\n // Uncompilable shape: enumerate matching rows, delete per key.\n for (const row of await listRows(conn, def, keyOrRange)) {\n await deleteRows(conn, def, requireKey(def, row));\n }\n return;\n }\n const collist = cols.map((c) => `\"${c}\"`).join(', ');\n if (multi) {\n await conn.exec(\n `DELETE FROM \"${junctionTable(def, multi)}\" WHERE (${collist}) IN (SELECT ${collist} FROM \"${def.name}\"${where})`,\n params,\n );\n }\n await conn.exec(`DELETE FROM \"${def.name}\"${where}`, params);\n}\n\nexport async function clearRows(conn: SqlConnection, def: StoreDef, wipe = false): Promise<void> {\n if (def.name === 'block_revisions' && !wipe) throw new StorageError(409, 'block history may only be removed by explicit wipe', 'revision_conflict');\n const multi = multiEntryIndex(def);\n if (multi) await conn.exec(`DELETE FROM \"${junctionTable(def, multi)}\"`);\n await conn.exec(`DELETE FROM \"${def.name}\"`);\n}\n\n/** Wipe all user stores; system stores (memberships) survive and the internal\n * schema metadata table is not a store, so the version guard is untouched. */\nexport async function wipeRows(conn: SqlConnection): Promise<void> {\n for (const def of STORE_DEFS) {\n if (!def.system) await clearRows(conn, def, true);\n }\n}\n\nfunction tableListSql(dialect: 'sqlite' | 'postgres'): string {\n return dialect === 'sqlite'\n ? `SELECT \"name\" FROM \"sqlite_master\" WHERE \"type\" = 'table'`\n : `SELECT \"table_name\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = current_schema()`;\n}\n\n/** Create the current schema only. Existing incompatible versions fail closed. */\nasync function ensureStoreTables(\n conn: SqlConnection,\n dialect: 'sqlite' | 'postgres',\n def: StoreDef,\n): Promise<void> {\n const keys = keyCols(def);\n const cols: Array<[string, string]> = keys.map((k, i) => [k, colSql(dialect, pathType(def, def.keyPath[i]))]);\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((path, part) => {\n cols.push([indexCol(idx.name, part), colSql(dialect, pathType(def, path))]);\n });\n }\n cols.push(['data', ' TEXT NOT NULL']);\n const colDefs = cols.map(([c, t]) => `\"${c}\"${t}`);\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${def.name}\" (${colDefs.join(', ')}, PRIMARY KEY (${keys.map((k) => `\"${k}\"`).join(', ')}))`,\n );\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n const parts = idx.keyPath.map((_, part) => `\"${indexCol(idx.name, part)}\"`).join(', ');\n await conn.exec(\n `CREATE ${idx.unique ? 'UNIQUE ' : ''}INDEX IF NOT EXISTS \"${def.name}__${sanitize(idx.name)}\" ON \"${def.name}\" (${parts})`,\n );\n }\n const multi = multiEntryIndex(def);\n if (multi) {\n const jt = junctionTable(def, multi);\n const jkeys = keys.map((k, i) => `\"${k}\"${colSql(dialect, pathType(def, def.keyPath[i]))}`);\n // v: BLOB affinity on sqlite (storage class preserved), byte-order C on PG.\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${jt}\" (${jkeys.join(', ')}, \"v\"${colSql(dialect, 'text')}, PRIMARY KEY (${[...keys, '\"v\"'].join(', ')}))`,\n );\n await conn.exec(`CREATE INDEX IF NOT EXISTS \"${jt}__v\" ON \"${jt}\" (\"v\")`);\n }\n if (def.name === 'notes' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"notes_revision_guard\" BEFORE UPDATE ON \"notes\"\n WHEN json_extract(NEW.\"data\", '$.sourceRevision') < json_extract(OLD.\"data\", '$.sourceRevision')\n OR ((json_extract(NEW.\"data\", '$.rawContent') IS NOT json_extract(OLD.\"data\", '$.rawContent')\n OR json_extract(NEW.\"data\", '$.blocks') IS NOT json_extract(OLD.\"data\", '$.blocks'))\n AND json_extract(NEW.\"data\", '$.sourceRevision') <= json_extract(OLD.\"data\", '$.sourceRevision'))\n BEGIN SELECT RAISE(ABORT, 'transaction_conflict: stale Note source revision'); END`);\n }\n if (def.name === 'block_revisions' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"block_revision_guard\" BEFORE INSERT ON \"block_revisions\"\n WHEN EXISTS (SELECT 1 FROM \"block_revisions\" old WHERE old.\"k0\" = NEW.\"k0\" AND old.\"k1\" = NEW.\"k1\" AND old.\"k2\" = NEW.\"k2\" AND old.\"data\" <> NEW.\"data\")\n BEGIN SELECT RAISE(ABORT, 'revision_conflict: immutable block revision collision'); END`);\n }\n if (def.name === 'sessions' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"session_pin_guard\" BEFORE UPDATE ON \"sessions\"\n WHEN json_extract(NEW.\"data\", '$.noteId') IS NOT json_extract(OLD.\"data\", '$.noteId')\n OR json_extract(NEW.\"data\", '$.blockId') IS NOT json_extract(OLD.\"data\", '$.blockId')\n OR json_extract(NEW.\"data\", '$.blockVersion') IS NOT json_extract(OLD.\"data\", '$.blockVersion')\n BEGIN SELECT RAISE(ABORT, 'invalid_session_pin: Session pin is immutable'); END`);\n }\n if (dialect === 'postgres' && ['notes', 'block_revisions', 'sessions'].includes(def.name)) {\n const condition = def.name === 'block_revisions'\n ? `EXISTS (SELECT 1 FROM \"block_revisions\" old WHERE old.\"k0\" = NEW.\"k0\" AND old.\"k1\" = NEW.\"k1\" AND old.\"k2\" = NEW.\"k2\" AND old.\"data\" <> NEW.\"data\")`\n : def.name === 'notes'\n ? `(NEW.\"data\"::jsonb->>'sourceRevision')::bigint < (OLD.\"data\"::jsonb->>'sourceRevision')::bigint OR ((NEW.\"data\"::jsonb->'rawContent' IS DISTINCT FROM OLD.\"data\"::jsonb->'rawContent' OR NEW.\"data\"::jsonb->'blocks' IS DISTINCT FROM OLD.\"data\"::jsonb->'blocks') AND (NEW.\"data\"::jsonb->>'sourceRevision')::bigint <= (OLD.\"data\"::jsonb->>'sourceRevision')::bigint)`\n : `NEW.\"data\"::jsonb->'noteId' IS DISTINCT FROM OLD.\"data\"::jsonb->'noteId' OR NEW.\"data\"::jsonb->'blockId' IS DISTINCT FROM OLD.\"data\"::jsonb->'blockId' OR NEW.\"data\"::jsonb->'blockVersion' IS DISTINCT FROM OLD.\"data\"::jsonb->'blockVersion'`;\n const code = def.name === 'block_revisions' ? 'revision_conflict' : def.name === 'notes' ? 'transaction_conflict' : 'invalid_session_pin';\n const guard = `${def.name}_guard`;\n await conn.exec(`CREATE OR REPLACE FUNCTION \"${guard}\"() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF ${condition} THEN RAISE EXCEPTION '${code}'; END IF; RETURN NEW; END; $$`);\n await conn.exec(`DROP TRIGGER IF EXISTS \"${guard}\" ON \"${def.name}\"`);\n await conn.exec(`CREATE TRIGGER \"${guard}\" BEFORE ${def.name === 'block_revisions' ? 'INSERT' : 'UPDATE'} ON \"${def.name}\" FOR EACH ROW EXECUTE FUNCTION \"${guard}\"()`);\n }\n}\n\n/** Internal schema metadata is not exposed or cleared by the store API.\n *\n * Version policy: the SQL DDL derives entirely from STORE_DEFS, so two\n * schema versions are compatible iff their derived table sets are equal.\n * - stored > DB_VERSION → refuse (never downgrade).\n * - stored < DB_VERSION with EQUAL table sets (v29 → v30: defs unchanged,\n * only browser-local sync stores were added) → bump the guard in place;\n * no row is read, rewritten or erased.\n * - stored < DB_VERSION with different tables → fail closed with the same\n * actionable schema_incompatible error as before.\n * - no guard + store tables → foreign database, refuse. */\nexport async function initializeStore(db: Database): Promise<void> {\n await db.transaction(async (tx) => {\n await tx.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n // Layered sync protocol tables + libsql internals are not part of the\n // STORE_DEFS-derived schema and never participate in the comparison.\n const ignored = (name: string): boolean =>\n name.startsWith('_wodwiki_') || name.startsWith('sqlite_');\n const storeTables = new Set<string>(STORE_DEFS.map((d) => d.name));\n for (const def of STORE_DEFS) {\n const multi = def.indexes.find((i) => i.multiEntry);\n if (multi) storeTables.add(junctionTable(def, multi));\n }\n const tableNames = new Set(\n (await tx.query(tableListSql(db.dialect))).map((r) => String(Object.values(r)[0])).filter((n) => !ignored(n)),\n );\n const guardRows = await tx.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [SCHEMA_KEY]);\n let stored: number | undefined;\n if (guardRows[0]) {\n const guard = JSON.parse(String(guardRows[0].value)) as { version?: unknown };\n if (typeof guard.version !== 'number' || !Number.isSafeInteger(guard.version) || guard.version < 0) {\n throw new StorageError(500, `corrupt ${SCHEMA_TABLE} guard row`, 'bad_schema_guard');\n }\n stored = guard.version;\n if (stored > DB_VERSION) {\n throw new StorageError(\n 500,\n `database schema v${stored} is newer than this server supports (v${DB_VERSION}); refusing to downgrade`,\n 'schema_incompatible',\n );\n }\n if (stored < DB_VERSION) {\n const missing = [...storeTables].filter((name) => !tableNames.has(name));\n const unexpected = [...tableNames].filter((name) => name !== SCHEMA_TABLE && !storeTables.has(name));\n if (missing.length > 0 || unexpected.length > 0) {\n throw new StorageError(\n 500,\n `database schema v${stored} is incompatible with v${DB_VERSION} (missing tables: ${missing.join(', ') || 'none'}; unrecognized tables: ${unexpected.join(', ') || 'none'}); recreation required using an explicitly disposable database`,\n 'schema_incompatible',\n );\n }\n // StoreDef equality holds — the stored rows already match the current\n // schema; only the guard version moves forward.\n }\n } else if ([...tableNames].some((name) => storeTables.has(name))) {\n throw new StorageError(\n 500,\n 'database contains store tables but no wod-wiki schema guard; refusing to adopt a foreign database — point SQLITE_PATH/DATABASE_URL at a fresh database',\n 'foreign_database',\n );\n }\n for (const def of STORE_DEFS) await ensureStoreTables(tx, db.dialect, def);\n if (stored !== DB_VERSION) {\n await tx.exec(\n `INSERT INTO \"${SCHEMA_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO UPDATE SET \"value\" = excluded.\"value\"`,\n [SCHEMA_KEY, JSON.stringify({ version: DB_VERSION })],\n );\n }\n });\n}\n","/** Current Note and actionable-block SQL projections. */\n\nimport type { Database, SqlConnection, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport { putRows, deleteRows, clearRows, getRows, listRows, storeDefinition, SCHEMA_TABLE, batchInsert, deleteIn } from './store';\nimport { decodeRowJson, encodeRowJson } from './codec';\nimport type { StoreDef } from '../schema';\nimport type { StoreName } from '../contract';\nimport {\n DOMAIN_PROJECTION_VERSION,\n type DomainPredicate,\n type DomainQueryResult,\n} from '../domain';\nimport { isRange, keyFromValue, type KeyDTO, type RangeDTO, type TxOp } from '../wire';\n// The app's own source/catalog semantics — no duplicated matchers.\nimport { catalogOfItem, sourceMatches } from '@bitcobblers/wod-wiki-wql';\nimport { rowsEqual, validateStoredPins } from '../validation';\nimport type { BlockRevision, Note, Session } from '../entities';\n\nconst TABLES = ['domain_note', 'query_block'] as const;\n\nconst PROJECTION_GUARD_KEY = 'domain_projection';\n\ntype SourceItem = Parameters<typeof sourceMatches>[0];\n\nfunction sourceItem(row: Record<string, unknown>): SourceItem {\n const item: SourceItem = {};\n for (const key of ['id', 'noteId', 'sourceId', 'type', 'seedOrigin', 'seedChunkId', 'sourcePath', 'catalog'] as const) {\n const value = row[key];\n if (typeof value === 'string') item[key] = value;\n else if (value != null) throw new StorageError(400, `${key} must be a string`);\n }\n return item;\n}\n\ninterface NoteIdentity { note_id: string; date: number | null; created_at: number; note: Note }\n\nconst num = (v: unknown): number | null => (typeof v === 'number' && Number.isFinite(v) ? v : null);\nconst text = (v: unknown): string | null => (typeof v === 'string' ? v : null);\nconst T = (v: unknown): SqlValue => (text(v) as SqlValue) ?? null;\nconst N = (v: unknown): SqlValue => num(v) ?? 0;\n\n// ── DDL (engine-neutral; numeric suffix only differs on postgres) ──────────\n\nfunction ensureDdl(db: Database): Promise<void> {\n const n = db.dialect === 'postgres' ? ' DOUBLE PRECISION' : '';\n const t = db.dialect === 'postgres' ? ' TEXT COLLATE \"C\"' : ' TEXT';\n const ddl = [\n `CREATE TABLE IF NOT EXISTS \"domain_note\" (\"note_id\"${t} PRIMARY KEY NOT NULL, \"note_type\"${t}, \"catalog\"${t}, \"source_id\"${t}, \"source_path\"${t}, \"title\"${t} NOT NULL, \"title_search\"${t} NOT NULL, \"created_at\"${n} NOT NULL, \"date\"${n}, \"text_search\"${t} NOT NULL, \"journal\"${n} NOT NULL, \"payload\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_date\" ON \"domain_note\" (\"date\", \"note_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_created\" ON \"domain_note\" (\"created_at\", \"note_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_source_path\" ON \"domain_note\" (\"source_path\")`,\n `CREATE TABLE IF NOT EXISTS \"query_block\" (\"occurrence_id\"${t} PRIMARY KEY NOT NULL, \"source_note_id\"${t}, \"parent_note_id\"${t}, \"content_id\"${t}, \"section_key\"${t}, \"ordinal\"${n}, \"data_type\"${t}, \"source_id\"${t}, \"source_path\"${t}, \"catalog\"${t}, \"effective_date\"${n} NOT NULL, \"created_at\"${n} NOT NULL, \"note_title\"${t}, \"normalized_text\"${t} NOT NULL, \"journal\"${n} NOT NULL, \"payload\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_type\" ON \"query_block\" (\"data_type\", \"effective_date\", \"occurrence_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_parent\" ON \"query_block\" (\"parent_note_id\", \"ordinal\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_content\" ON \"query_block\" (\"content_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_source_path\" ON \"query_block\" (\"source_path\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_source_note\" ON \"query_block\" (\"source_note_id\")`,\n ];\n return db.transaction(async (tx) => {\n for (const sql of ddl) await tx.exec(sql);\n });\n}\n\n\nconst DOMAIN_NOTE_COLS = ['note_id','note_type','catalog','source_id','source_path','title','title_search','created_at','date','text_search','journal','payload'] as const;\nconst QUERY_BLOCK_COLS = ['occurrence_id','source_note_id','parent_note_id','content_id','section_key','ordinal','data_type','source_id','source_path','catalog','effective_date','created_at','note_title','normalized_text','journal','payload'] as const;\n\nconst conflictUpdate = (cols: readonly string[], keys: readonly string[]): string =>\n `ON CONFLICT (${keys.map((k) => `\"${k}\"`).join(', ')}) DO UPDATE SET ` +\n cols.filter((c) => !keys.includes(c)).map((c) => `\"${c}\" = excluded.\"${c}\"`).join(',') +\n ` WHERE ` + cols.filter(col => !keys.includes(col)).map(col => `\"${col}\" IS DISTINCT FROM excluded.\"${col}\"`).join(' OR ');\n\n/** One domain_note row; undefined when the note has no identity (store write\n * still succeeds — nothing to project). */\nfunction domainNoteRow(note: Record<string, unknown>): SqlValue[] | undefined {\n const id = text(note.id);\n if (!id) return undefined;\n const source = sourceItem(note);\n return [\n id,\n T(note.type),\n T(catalogOfItem(source)),\n T(note.sourceId),\n T(note.sourcePath),\n T(note.title) ?? '',\n (text(note.title) ?? '').toLowerCase(),\n N(note.createdAt),\n num(note.date),\n (text(note.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(note),\n ];\n}\n\nasync function upsertDomainNotes(conn: SqlConnection, notes: Record<string, unknown>[]): Promise<void> {\n const rows = notes.map(domainNoteRow).filter((r): r is SqlValue[] => r !== undefined);\n await batchInsert(conn, 'domain_note', [...DOMAIN_NOTE_COLS], rows, conflictUpdate(DOMAIN_NOTE_COLS, ['note_id']));\n}\n\n\n/** One query_block row; undefined when the block has no identity. */\nfunction queryBlockRow(block: Record<string, unknown>, parent: NoteIdentity | undefined): SqlValue[] | undefined {\n const id = text(block.id);\n if (!id) return undefined;\n const source = sourceItem(block);\n const createdAt = N(block.createdAt);\n const effective = parent ? (parent.date ?? parent.created_at) : createdAt;\n return [\n id,\n T(block.noteId),\n parent?.note_id ?? null,\n T(block.blockContentId),\n T(block.blockId),\n num(block.position),\n T(block.dataType),\n T(block.sourceId),\n T(block.sourcePath),\n T(catalogOfItem(source)),\n effective,\n createdAt,\n parent?.note.title ?? T(block.noteTitle),\n (text(block.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(parent ? { ...block, noteTitle: parent.note.title } : block),\n ];\n}\n\nasync function upsertQueryBlocks(conn: SqlConnection, blocks: [Record<string, unknown>, NoteIdentity | undefined][]): Promise<void> {\n const rows = blocks.map(([b, p]) => queryBlockRow(b, p)).filter((r): r is SqlValue[] => r !== undefined);\n await batchInsert(conn, 'query_block', [...QUERY_BLOCK_COLS], rows, conflictUpdate(QUERY_BLOCK_COLS, ['occurrence_id']));\n}\n\n// ── Parent identity resolution ───────────────────────────────────────────────\n\ninterface ParentIndex { byNoteId: Map<string, NoteIdentity> }\n\nfunction indexNoteIdentities(notes: Iterable<Record<string, unknown>>): ParentIndex {\n const byNoteId = new Map<string, NoteIdentity>();\n for (const note of notes) {\n const id = text(note.id);\n if (id) byNoteId.set(id, { note_id: id, date: num(note.date), created_at: num(note.createdAt) ?? 0, note: note as unknown as Note });\n }\n return { byNoteId };\n}\n\nfunction resolveParentFrom(index: ParentIndex, block: Record<string, unknown>): NoteIdentity | undefined {\n const parent = typeof block.noteId === 'string' ? index.byNoteId.get(block.noteId) : undefined;\n const mapped = typeof block.blockId === 'string' ? parent?.note.blocks[block.blockId] : undefined;\n return parent && mapped && block.id === `${parent.note_id}:${mapped.id}`\n && block.blockVersion === mapped.version && block.dataType === mapped.kind\n && block.sourceRevision === parent.note.sourceRevision && block.from === mapped.from && block.to === mapped.to\n && block.rawContent === parent.note.rawContent.slice(mapped.from, mapped.to) ? parent : undefined;\n}\n\nasync function fetchParentIndex(conn: SqlConnection, noteIds: string[]): Promise<ParentIndex> {\n const notes = await getRows(conn, storeDefinition('notes'), noteIds);\n return indexNoteIdentities(notes.filter((row): row is Record<string, unknown> => row !== undefined));\n}\n\n// ── Per-key refresh ──────────────────────────────────────────────────────────\n\nconst keyHead = (key: KeyDTO): SqlValue => (Array.isArray(key) ? (key[0] as SqlValue) : key);\n\n/** Chunked `col IN (…)` SELECT returning the first column as strings. */\nasync function selectIn(conn: SqlConnection, selectCol: string, table: string, col: string, vals: SqlValue[]): Promise<string[]> {\n const IN_CHUNK = 500;\n const out: string[] = [];\n for (let i = 0; i < vals.length; i += IN_CHUNK) {\n const part = vals.slice(i, i + IN_CHUNK);\n const rows = await conn.query(`SELECT \"${selectCol}\" FROM \"${table}\" WHERE \"${col}\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const r of rows) out.push(String(r[selectCol]));\n }\n return out;\n}\n\nasync function healQueryBlocksForNotes(conn: SqlConnection, noteIds: string[]): Promise<void> {\n const ids = await selectIn(conn, 'occurrence_id', 'query_block', 'source_note_id', noteIds);\n await refreshBlocks(conn, [...new Set(ids)]);\n}\n\nasync function refreshNotes(conn: SqlConnection, ids: KeyDTO[]): Promise<void> {\n const ks = [...new Set(ids.map((id) => String(keyHead(id))))];\n if (ks.length === 0) return;\n const found = new Map<string, Record<string, unknown>>();\n for (let i = 0; i < ks.length; i += 500) {\n const part = ks.slice(i, i + 500);\n const rows = await conn.query(`SELECT \"k0\", \"data\" FROM \"notes\" WHERE \"k0\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const row of rows) found.set(String(row.k0), decodeRowJson<Record<string, unknown>>(String(row.data)));\n }\n const present: Record<string, unknown>[] = [];\n const missing: string[] = [];\n for (const k of ks) {\n const note = found.get(k);\n if (note) present.push(note);\n else missing.push(k);\n }\n await upsertDomainNotes(conn, present);\n const presentIds = present.map((n) => text(n.id)).filter((x): x is string => !!x);\n await healQueryBlocksForNotes(conn, presentIds);\n await deleteIn(conn, 'domain_note', 'note_id', missing);\n await deleteIn(conn, 'query_block', 'source_note_id', missing);\n await deleteIn(conn, 'block_index', 'i_by_note_0', missing);\n await deleteIn(conn, 'block_efforts', 'i_by_note_0', missing);\n}\n\n\nasync function refreshBlocks(conn: SqlConnection, ids: KeyDTO[]): Promise<void> {\n const ks = [...new Set(ids.map((id) => String(keyHead(id))))];\n if (ks.length === 0) return;\n const found = new Map<string, Record<string, unknown>>();\n for (let i = 0; i < ks.length; i += 500) {\n const part = ks.slice(i, i + 500);\n const rows = await conn.query(`SELECT \"k0\", \"data\" FROM \"block_index\" WHERE \"k0\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const row of rows) found.set(String(row.k0), decodeRowJson<Record<string, unknown>>(String(row.data)));\n }\n const blocks = [...found.values()];\n const noteIds = [...new Set(blocks.map((b) => text(b.noteId)).filter((x): x is string => !!x))];\n const index = await fetchParentIndex(conn, noteIds);\n await upsertQueryBlocks(conn, blocks.map((b) => [b, resolveParentFrom(index, b)]));\n await deleteIn(conn, 'query_block', 'occurrence_id', ks.filter((k) => !found.has(k)));\n}\n\ninterface Impact {\n notes: KeyDTO[];\n pinnedNotes: Note[];\n pinnedSessions: Session[];\n blocks: KeyDTO[];\n notesClear: boolean;\n blocksClear: boolean;\n}\n\nconst TRACKED: Partial<Record<StoreName, 'notes' | 'blocks'>> = {\n notes: 'notes',\n block_index: 'blocks',\n};\n\nasync function deleteTargetKeys(conn: SqlConnection, def: StoreDef, target: KeyDTO | RangeDTO): Promise<KeyDTO[]> {\n if (!isRange(target)) return [target];\n const rows = await listRows(conn, def, target);\n return rows.map((row) => keyFromValue(def, row));\n}\n\n/** Checks precede mutations; pins and projections commit with source rows. */\nexport async function refreshDomain(\n conn: SqlConnection,\n ops: TxOp[],\n): Promise<(KeyDTO | null)[]> {\n const impact: Impact = {\n notes: [], blocks: [], pinnedNotes: [], pinnedSessions: [],\n notesClear: false, blocksClear: false,\n };\n const results: (KeyDTO | null)[] = [];\n for (const op of ops) if (op === null || typeof op !== 'object' || Array.isArray(op)) throw new StorageError(400, 'tx op must be an object');\n const checks = ops.filter((op): op is Extract<TxOp, {op: 'check'}> => op.op === 'check');\n const checkStores = [...new Set(checks.map(op => op.store))];\n for (const store of checkStores) {\n const scoped = checks.filter(op => op.store === store);\n const actual = await getRows(conn, storeDefinition(store), scoped.map(op => op.key));\n scoped.forEach((op, i) => {\n if (!rowsEqual(actual[i] ?? null, op.value)) throw new StorageError(409, 'transaction read changed before commit', 'transaction_conflict');\n });\n }\n // Consecutive puts on one store flush as chunked multi-row INSERTs; the\n // flush also precedes any delete/clear so range deletes observe them.\n let pending: { def: StoreDef; values: unknown[] } | undefined;\n const flushPuts = async (): Promise<void> => {\n if (!pending) return;\n const batch = pending;\n pending = undefined;\n if (batch.values.length === 0) return;\n const changed: KeyDTO[] = [];\n const keys = await putRows(conn, batch.def, batch.values, changed);\n const slot = TRACKED[batch.def.name];\n if (slot) impact[slot].push(...changed);\n const changedSet = new Set(changed.map(key => JSON.stringify(key)));\n if (batch.def.name === 'notes') impact.pinnedNotes.push(...batch.values.filter(value => changedSet.has(JSON.stringify(keyFromValue(batch.def, value)))) as Note[]);\n if (batch.def.name === 'sessions') impact.pinnedSessions.push(...batch.values.filter(value => changedSet.has(JSON.stringify(keyFromValue(batch.def, value)))) as Session[]);\n results.push(...keys);\n };\n for (const op of ops) {\n if (op.op === 'check') { results.push(null); continue; }\n const store = 'store' in op ? op.store : undefined;\n const def = storeDefinition(typeof store === 'string' ? store : String(store));\n const kind: unknown = typeof op.op === 'string' ? op.op : undefined; // runtime junk tolerated\n if (op.op === 'put') {\n if (pending && pending.def.name !== def.name) await flushPuts();\n (pending ??= { def, values: [] }).values.push(op.value);\n } else if (op.op === 'delete') {\n await flushPuts();\n const slot = TRACKED[def.name];\n if (slot) {\n // op.key types as KeyDTO on the wire, but deleteRows honours ranges too.\n for (const key of await deleteTargetKeys(conn, def, op.key as KeyDTO | RangeDTO)) impact[slot].push(key);\n }\n await deleteRows(conn, def, op.key as KeyDTO | RangeDTO);\n results.push(null);\n } else if (op.op === 'clear') {\n await flushPuts();\n await clearRows(conn, def);\n if (def.name === 'notes') impact.notesClear = true;\n else if (def.name === 'block_index') impact.blocksClear = true;\n results.push(null);\n } else {\n throw new StorageError(400, `tx op must be check | put | delete | clear, got: ${String(kind)}`);\n }\n }\n await flushPuts();\n const finalNotes = (await getRows(conn, storeDefinition('notes'), [...new Set(impact.pinnedNotes.map(note => note.id))])).filter(Boolean) as Note[];\n const finalSessions = (await getRows(conn, storeDefinition('sessions'), [...new Set(impact.pinnedSessions.map(session => session.id))])).filter(Boolean) as Session[];\n await validateStoredPins(finalNotes, finalSessions, keys => getRows(conn, storeDefinition('block_revisions'), keys as KeyDTO[]) as Promise<(BlockRevision | undefined)[]>);\n await refresh(conn, impact);\n return results;\n}\n\nasync function refresh(conn: SqlConnection, impact: Impact): Promise<void> {\n // Clears stage first: a tx of [clear, put n1] must end with exactly n1\n // projected, and [put n1, clear] with nothing — clearing the derived rows\n // before re-projecting surviving keys satisfies both orders.\n if (impact.notesClear) {\n await conn.exec(`DELETE FROM \"domain_note\"`);\n await conn.exec(`DELETE FROM \"query_block\" WHERE \"source_note_id\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n await conn.exec(`DELETE FROM \"block_index\" WHERE \"i_by_note_0\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n await conn.exec(`DELETE FROM \"block_efforts\" WHERE \"i_by_note_0\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n }\n if (impact.blocksClear) await conn.exec(`DELETE FROM \"query_block\"`);\n await refreshNotes(conn, impact.notes);\n await refreshBlocks(conn, impact.blocks);\n}\n\n/**\n * Rebuild the derived tables from the source-of-truth store rows and stamp\n * the projection guard. Caller owns the transaction (atomicity) — the guard\n * row commits together with the rebuilt rows.\n */\nexport async function rebuildProjections(conn: SqlConnection): Promise<void> {\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n for (const t of TABLES) await conn.exec(`DELETE FROM \"${t}\"`);\n const notes = await conn.query(`SELECT \"data\" FROM \"notes\"`);\n const noteObjs = notes.map((row) => decodeRowJson<Record<string, unknown>>(String(row.data)));\n await upsertDomainNotes(conn, noteObjs);\n const blocks = await conn.query(`SELECT \"data\" FROM \"block_index\"`);\n const blockObjs = blocks.map((row) => decodeRowJson<Record<string, unknown>>(String(row.data)));\n // domain_note was just rebuilt from exactly these notes — parent identity\n // resolves in memory instead of one query per block.\n const index = indexNoteIdentities(noteObjs);\n await upsertQueryBlocks(conn, blockObjs.map((b) => [b, resolveParentFrom(index, b)]));\n await conn.exec(\n `INSERT INTO \"${SCHEMA_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO UPDATE SET \"value\" = excluded.\"value\"`,\n [PROJECTION_GUARD_KEY, JSON.stringify({ version: DOMAIN_PROJECTION_VERSION })],\n );\n}\n\n/** Boot-time derived state: DDL + rebuild only when the guard is incompatible\n * (first run, projection version bump, or an interrupted prior rebuild). */\nexport async function initializeDomain(db: Database): Promise<void> {\n await ensureDdl(db);\n await db.transaction(async (tx) => {\n await tx.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n const guardRows = await tx.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [PROJECTION_GUARD_KEY]);\n let guard: { version?: unknown } | undefined;\n if (guardRows[0]) {\n try {\n guard = JSON.parse(String(guardRows[0].value)) as { version?: unknown };\n } catch {\n guard = undefined; // corrupt guard → rebuild and restamp\n }\n }\n if (guard?.version === DOMAIN_PROJECTION_VERSION) return;\n await rebuildProjections(tx);\n });\n}\n\n/** Clears derived tables after a data wipe (empty is a consistent state). */\nexport async function wipeDomain(conn: SqlConnection): Promise<void> {\n for (const t of TABLES) await conn.exec(`DELETE FROM \"${t}\"`);\n}\n\n// ── Domain query execution ───────────────────────────────────────────────────\n\nexport const MAX_BODY = 64 * 1024;\nconst MAX_CLAUSES = 32;\nconst MAX_VALUES = 64;\nconst MAX_VALUE_LEN = 256;\nconst MAX_ORDER = 4;\n\ntype Plan = 'notes' | 'blocks' | 'entries';\n\nconst listFields = ['id', 'noteId', 'type', 'catalog', 'source', 'tags', 'effort'] as const;\n\nconst onlyKeys = (obj: Record<string, unknown>, allowed: string[]): boolean =>\n Object.keys(obj).every((k) => allowed.includes(k));\n\nfunction bad(msg: string): StorageError {\n return new StorageError(400, msg);\n}\n\nfunction strArray(v: unknown, what: string): string[] {\n if (!Array.isArray(v) || v.length < 1 || v.length > MAX_VALUES) {\n throw bad(`${what} needs 1..=${MAX_VALUES} values`);\n }\n return v.map((x) => {\n if (typeof x !== 'string' || x.length < 1 || x.length > MAX_VALUE_LEN) {\n throw bad(`${what} values must be 1..=${MAX_VALUE_LEN} chars`);\n }\n return x;\n });\n}\n\n/** Strict predicate parse — unknown/missing/duplicate payload keys are 400. */\nfunction parsePredicate(v: unknown, plan: Plan): DomainPredicate {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) throw bad('predicate must be an object');\n const obj = v as Record<string, unknown>;\n const field = obj.field;\n if (typeof field !== 'string') throw bad('predicate.field required');\n let negate = false;\n if ('negate' in obj) {\n if (typeof obj.negate !== 'boolean') throw bad('predicate.negate must be boolean');\n negate = obj.negate;\n }\n if ((listFields as readonly string[]).includes(field)) {\n if (!onlyKeys(obj, ['field', 'values', 'negate'])) {\n throw bad(`predicate ${field} accepts only field/values/negate`);\n }\n return { field, values: strArray(obj.values, `predicate ${field}.values`), ...(negate ? { negate } : {}) } as DomainPredicate;\n }\n if (field === 'text') {\n if (!onlyKeys(obj, ['field', 'value']) || negate) throw bad('predicate text accepts only {field, value}');\n if (typeof obj.value !== 'string' || obj.value.length < 1 || obj.value.length > MAX_VALUE_LEN) {\n throw bad('predicate text.value must be 1..=256 chars');\n }\n return { field: 'text', value: obj.value };\n }\n if (field === 'date') {\n if (!onlyKeys(obj, ['field', 'start', 'end', 'endExclusive'])) {\n throw bad('predicate date accepts only field/start/end/endExclusive');\n }\n const n = (k: string): number => {\n if (typeof obj[k] !== 'number' || !Number.isFinite(obj[k])) throw bad(`predicate date.${k} must be a finite number`);\n return obj[k];\n };\n if ('endExclusive' in obj && typeof obj.endExclusive !== 'boolean') {\n throw bad('predicate date.endExclusive must be boolean');\n }\n return { field: 'date', start: n('start'), end: n('end'), ...(obj.endExclusive === true ? { endExclusive: true } : {}) };\n }\n if (field === 'page') {\n if (plan === 'blocks') throw bad('predicate page does not apply to the blocks plan');\n if (!onlyKeys(obj, ['field', 'value'])) throw bad('predicate page accepts only {field, value}');\n if (typeof obj.value !== 'boolean') throw bad('predicate page.value must be boolean');\n return { field: 'page', value: obj.value };\n }\n if (field === 'sourceFence') {\n if (!onlyKeys(obj, ['field'])) throw bad('predicate sourceFence accepts only {field}');\n return { field: 'sourceFence' };\n }\n if (field === 'defaultNotes') {\n if (plan === 'blocks') throw bad('predicate defaultNotes does not apply to the blocks plan');\n if (!onlyKeys(obj, ['field', 'feeds'])) throw bad('predicate defaultNotes accepts only {field, feeds}');\n if (typeof obj.feeds !== 'boolean') throw bad('predicate defaultNotes.feeds must be boolean');\n return { field: 'defaultNotes', feeds: obj.feeds };\n }\n throw bad(`unknown predicate field: ${field}`);\n}\n\nfunction parseClauses(v: unknown, plan: Plan, what: string): DomainPredicate[] {\n if (v === undefined) return [];\n if (!Array.isArray(v)) throw bad(`${what} must be an array`);\n if (v.length > MAX_CLAUSES) throw bad(`${what} supports at most ${MAX_CLAUSES} clauses`);\n return v.map((p) => parsePredicate(p, plan));\n}\n\nfunction orderCols(field: string, plan: Plan): string {\n if (field === 'id' || field === 'createdAt') return field;\n if (plan === 'blocks') {\n if (field === 'noteTitle' || field === 'dataType' || field === 'position') return field;\n throw bad(field === 'date' || field === 'title' ? `order ${field} does not apply to the blocks plan` : `unknown order field: ${field}`);\n }\n if (field === 'date' || field === 'title') return field;\n throw bad(\n field === 'noteTitle' || field === 'dataType' || field === 'position'\n ? `order ${field} only applies to the blocks plan`\n : `unknown order field: ${field}`,\n );\n}\n\ninterface ParsedQuery {\n plan: Plan;\n selection: DomainPredicate[];\n filters: DomainPredicate[];\n order: { field: string; desc: boolean }[];\n offset: number;\n limit?: number;\n}\n\nfunction parseQuery(body: unknown): ParsedQuery {\n if (body === null || typeof body !== 'object' || Array.isArray(body)) throw bad('body must be a DomainQuery object');\n const obj = body as Record<string, unknown>;\n const plan = obj.plan;\n if (plan !== 'notes' && plan !== 'blocks' && plan !== 'entries') {\n throw bad('body.plan must be notes | blocks | entries');\n }\n for (const k of Object.keys(obj)) {\n if (!['plan', 'selection', 'filters', 'order', 'offset', 'limit'].includes(k)) {\n throw bad(`unknown DomainQuery field: ${k}`);\n }\n }\n const order: { field: string; desc: boolean }[] = [];\n if (obj.order !== undefined) {\n if (!Array.isArray(obj.order)) throw bad('order must be an array');\n if (obj.order.length > MAX_ORDER) throw bad(`order supports at most ${MAX_ORDER} keys`);\n for (const entry of obj.order) {\n if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) throw bad('order entries must be objects');\n const e = entry as Record<string, unknown>;\n if (typeof e.field !== 'string') throw bad('order.field required');\n if (!onlyKeys(e, ['field', 'direction'])) throw bad('order entries accept only field/direction');\n if (e.direction !== undefined && e.direction !== 'asc' && e.direction !== 'desc') {\n throw bad('order.direction must be asc | desc');\n }\n order.push({ field: orderCols(e.field, plan), desc: e.direction === 'desc' });\n }\n }\n const intIn = (k: string): number | undefined => {\n const v = obj[k];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'number' || !Number.isInteger(v)) throw bad(`${k} must be an integer`);\n if (v < 0) throw bad(`${k} must be >= 0`);\n return v;\n };\n // Omitted limit = complete matched set; an explicit limit is the caller's\n // paging choice, never silently truncated.\n return {\n plan,\n selection: parseClauses(obj.selection, plan, 'selection'),\n filters: parseClauses(obj.filters, plan, 'filters'),\n order,\n offset: intIn('offset') ?? 0,\n limit: intIn('limit'),\n };\n}\n\n// ── Predicate → SQL (bound values only) ──────────────────────────────────────\n\nclass Sql {\n readonly params: SqlValue[] = [];\n constructor(readonly pg: boolean) {}\n bind(v: SqlValue): string {\n this.params.push(v);\n return '?';\n }\n /** Literal substring over a lowercased materialized column — no wildcards. */\n contains(col: string, needle: string): string {\n const p = this.bind(needle.toLowerCase());\n return this.pg ? `strpos(${col}, ${p}) > 0` : `instr(${col}, ${p}) > 0`;\n }\n inList(col: string, values: string[]): string {\n return `${col} IN (${values.map((v) => this.bind(v)).join(', ')})`;\n }\n}\n\n/** WQL source domain — mirrors WQL_SOURCE_VALUES; the non-shape kinds\n * (dashboards/efforts) are exact sourceId literals, journal is materialized. */\nconst SOURCE_ALL_KINDS = ['journal', 'feeds', 'guides', 'playground', 'dashboards', 'efforts'];\n\nfunction sourceKindSql(ctx: Sql, kind: string, sid: string, typeExpr: string | null, journalCol: string): string {\n switch (kind) {\n case 'journal':\n return `(${journalCol} = 1)`;\n case 'feed':\n case 'feeds':\n // Storage identities keep the collection:/page:collection: prefixes.\n return `(substr(${sid}, 1, 11) = 'collection:' OR substr(${sid}, 1, 16) = 'page:collection:')`;\n case 'page':\n case 'pages':\n return `(${sid} = 'page' OR substr(${sid}, 1, 5) = 'page:' OR substr(${sid}, 1, 7) = 'guides:')`;\n case 'guide':\n case 'guides':\n return `(substr(${sid}, 1, 7) = 'guides:')`;\n case 'playground':\n return typeExpr\n ? `(${sid} = 'playground' OR (${typeExpr} IS NOT NULL AND ${typeExpr} = 'playground'))`\n : `(${sid} = 'playground')`;\n default:\n // Exact sourceId literal; NULL sourceId never equals a value.\n return `(${sid} = ${ctx.bind(kind)})`;\n }\n}\n\nfunction sourcePredicateSql(ctx: Sql, values: string[], negate: boolean, sid: string, typeExpr: string | null, journalCol: string): string {\n const matched = values.map((v) => sourceKindSql(ctx, v, sid, typeExpr, journalCol)).join(' OR ');\n return negate ? `NOT COALESCE((${matched}), FALSE)` : matched;\n}\n\nconst wrap = (negate: boolean, matchSql: string): string =>\n negate ? `NOT COALESCE ((${matchSql}), FALSE)` : matchSql;\n\nfunction predicateSql(ctx: Sql, p: DomainPredicate, plan: Plan): string {\n const blocks = plan === 'blocks';\n const id = blocks ? 'q.\"occurrence_id\"' : 'n.\"note_id\"';\n const sid = blocks ? 'q.\"source_id\"' : 'n.\"source_id\"';\n const typeExpr = blocks ? null : 'n.\"note_type\"';\n const typeCol = blocks ? 'q.\"data_type\"' : 'n.\"note_type\"';\n const catalogCol = blocks ? 'q.\"catalog\"' : 'n.\"catalog\"';\n const journalCol = blocks ? 'q.\"journal\"' : 'n.\"journal\"';\n const noteId = blocks ? 'q.\"source_note_id\"' : 'n.\"note_id\"';\n switch (p.field) {\n case 'id':\n return wrap(p.negate === true, ctx.inList(id, p.values));\n case 'noteId':\n return wrap(p.negate === true, ctx.inList(noteId, p.values));\n case 'type':\n return wrap(p.negate === true, ctx.inList(typeCol, p.values));\n case 'catalog':\n return wrap(p.negate === true, ctx.inList(catalogCol, p.values));\n case 'source':\n return sourcePredicateSql(ctx, p.values, p.negate === true, sid, typeExpr, journalCol);\n case 'tags':\n // Tags hang off the parent note on both planes.\n return wrap(\n p.negate === true,\n `EXISTS (SELECT 1 FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" ` +\n `WHERE nt.\"i_by_note_0\" = ${noteId} AND t.\"i_by_label_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'effort':\n return wrap(\n p.negate === true,\n blocks\n ? `(q.\"content_id\" IS NOT NULL AND EXISTS (SELECT 1 FROM \"block_efforts\" be ` +\n `WHERE be.\"i_by_block_0\" = q.\"content_id\" AND be.\"i_by_effort_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')})))`\n : `EXISTS (SELECT 1 FROM \"block_efforts\" be WHERE be.\"i_by_note_0\" = ${noteId} ` +\n `AND be.\"i_by_effort_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'text':\n return blocks ? ctx.contains('q.\"normalized_text\"', p.value)\n : `(${ctx.contains('n.\"title_search\"', p.value)} OR ${ctx.contains('n.\"text_search\"', p.value)})`;\n case 'date': {\n const expr = blocks ? 'q.\"effective_date\"' : 'COALESCE(n.\"date\", n.\"created_at\")';\n const lo = ctx.bind(p.start);\n const hi = ctx.bind(p.end);\n const cmp = p.endExclusive ? '<' : '<=';\n return `(${expr} >= ${lo} AND ${expr} ${cmp} ${hi})`;\n }\n case 'page':\n return p.value ? `n.\"note_type\" = 'page'` : `(n.\"note_type\" IS NULL OR n.\"note_type\" <> 'page')`;\n case 'sourceFence': {\n const all = SOURCE_ALL_KINDS.map((k) => sourceKindSql(ctx, k, sid, typeExpr, journalCol)).join(' OR ');\n return `(${sid} IS NULL OR ${sid} = '' OR ${all})`;\n }\n case 'defaultNotes':\n return p.feeds\n ? `(n.\"note_type\" IS NULL OR n.\"note_type\" <> 'page')`\n : `(n.\"note_type\" = 'note' OR (substr(COALESCE(n.\"source_id\", ''), 1, 5) <> 'page:' ` +\n `AND substr(COALESCE(n.\"source_id\", ''), 1, 7) <> 'guides:' ` +\n `AND COALESCE(n.\"note_type\", '') NOT IN ('feed','syntax','behavior','analytics','dashboard','home','page')))`;\n }\n}\n\nfunction clausesSql(ctx: Sql, clauses: DomainPredicate[], plan: Plan): string {\n if (clauses.length === 0) return '';\n return ` WHERE ${clauses.map((p) => predicateSql(ctx, p, plan)).join(' AND ')}`;\n}\n\nfunction orderSql(order: { field: string; desc: boolean }[], plan: Plan): string {\n const idCol = plan === 'blocks' ? 'q.\"occurrence_id\"' : 'n.\"note_id\"';\n const cols: Record<string, string> =\n plan === 'blocks'\n ? { id: 'q.\"occurrence_id\"', createdAt: 'q.\"created_at\"', noteTitle: 'q.\"note_title\"', dataType: 'q.\"data_type\"', position: 'q.\"ordinal\"' }\n : { id: 'n.\"note_id\"', createdAt: 'n.\"created_at\"', date: 'n.\"date\"', title: 'n.\"title\"' };\n // Deterministic paging: pinned NULL placement (sqlite and pg disagree on\n // defaults) plus the primary key as final tiebreaker.\n const parts = order.map(({ field, desc }) =>\n desc ? `${cols[field]} DESC NULLS FIRST` : `${cols[field]} ASC NULLS LAST`,\n );\n if (!order.some((o) => o.field === 'id')) parts.push(`${idCol} ASC`);\n return parts.join(', ');\n}\n\nfunction pagingSql(q: ParsedQuery, pg: boolean): string {\n let s = '';\n if (q.limit !== undefined) s += ` LIMIT ${q.limit}`;\n else if (q.offset > 0 && !pg) s += ' LIMIT -1'; // sqlite needs LIMIT before OFFSET\n if (q.offset > 0) s += ` OFFSET ${q.offset}`;\n return s;\n}\n\n/** Fail closed while any projected block lacks a resolved parent identity. */\nasync function gate(conn: SqlConnection): Promise<void> {\n const rows = await conn.query(`SELECT COUNT(*) AS \"n\" FROM \"query_block\" WHERE \"parent_note_id\" IS NULL`);\n const stale = Number(rows[0]?.n ?? 0);\n if (stale > 0) {\n throw new StorageError(\n 409,\n `domain projections stale: ${stale} block rows have invalid or unresolved current parents`,\n 'domain_projection_unavailable',\n );\n }\n}\n\nfunction planTable(plan: Plan): string {\n return plan === 'blocks' ? '\"query_block\" q' : '\"domain_note\" n';\n}\n\nasync function execute(conn: SqlConnection, q: ParsedQuery, pg: boolean): Promise<DomainQueryResult> {\n const plan = q.plan;\n const table = planTable(plan);\n\n const selCtx = new Sql(pg);\n const selWhere = clausesSql(selCtx, q.selection, plan);\n const filterCtx = new Sql(pg);\n const filterWhere = clausesSql(filterCtx, q.filters, plan);\n const allParams: SqlValue[] = [...selCtx.params, ...filterCtx.params];\n const fullWhere =\n selWhere && filterWhere\n ? `${selWhere} AND ${filterWhere.replace(/^ WHERE /, '')}`\n : selWhere || filterWhere;\n\n const count = async (where: string, params: SqlValue[]): Promise<number> =>\n Number((await conn.query(`SELECT COUNT(*) AS \"n\" FROM ${table}${where}`, params))[0]?.n ?? 0);\n const selectedCount = await count(selWhere, selCtx.params);\n const matchedCount = q.filters.length === 0 ? selectedCount : await count(fullWhere, allParams);\n\n const ordering = orderSql(q.order, plan);\n const paging = pagingSql(q, pg);\n\n if (plan !== 'entries') {\n const pageSql = `SELECT \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const rows: unknown[] = (await conn.query(pageSql, allParams)).map((r) => decodeRowJson(String(r.payload)));\n const result = { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount, matchedCount, plan, rows };\n // Parsed payloads re-typed by the shared plan schema (JSON columns are unknown).\n return result as DomainQueryResult;\n }\n\n const pageSql = `SELECT \"note_id\", \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const noteRows = await conn.query(pageSql, allParams);\n const buckets: [unknown[], unknown[], unknown[]][] = noteRows.map(() => [[], [], []]);\n const index = new Map<string, number>();\n noteRows.forEach((row, i) => index.set(String(row.note_id), i));\n for (let start = 0; start < noteRows.length; start += 500) {\n const ids = noteRows.slice(start, start + 500).map(row => String(row.note_id));\n const placeholders = ids.map(() => '?').join(', ');\n const statements = [\n { sql: `SELECT nt.\"i_by_note_0\" AS \"note_id\", t.\"data\" AS \"payload\" FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" WHERE nt.\"i_by_note_0\" IN (${placeholders}) ORDER BY t.\"k0\"`, params: ids },\n { sql: `SELECT p.\"i_by_note_0\" AS \"note_id\", p.\"data\" AS \"payload\" FROM \"page_notes\" p WHERE p.\"i_by_note_0\" IN (${placeholders}) ORDER BY p.\"k0\"`, params: ids },\n { sql: `SELECT DISTINCT p.\"i_by_note_0\" AS \"note_id\", pg.\"data\" AS \"payload\" FROM \"page_notes\" p JOIN \"page\" pg ON pg.\"k0\" = p.\"i_by_page_0\" WHERE p.\"i_by_note_0\" IN (${placeholders}) ORDER BY pg.\"data\"`, params: ids },\n ];\n const relations = conn.batch ? await conn.batch(statements) : await (async () => {\n const rows = [];\n for (const statement of statements) rows.push(await conn.query(statement.sql, statement.params));\n return rows;\n })();\n relations.forEach((rows, relation) => rows.forEach(row => {\n const i = index.get(String(row.note_id));\n if (i !== undefined) buckets[i][relation].push(decodeRowJson(String(row.payload)));\n }));\n }\n const rows = noteRows.map((row, i) => {\n const [tags, links, pages] = buckets[i];\n return { note: decodeRowJson(String(row.payload)), tags, links, pages };\n });\n return { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount, matchedCount, plan, rows } as DomainQueryResult;\n}\n\n/** Validate, gate, execute on one consistent snapshot (server route and\n * SqlStorage.queryDomain share this entry). */\nexport async function handleDomainQuery(db: Database, body: unknown): Promise<DomainQueryResult> {\n const query = parseQuery(body);\n return db.transaction(async (tx) => {\n // Counts and page must share one snapshot; writes keep the default level.\n if (db.dialect === 'postgres') await tx.exec('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY');\n await gate(tx);\n return execute(tx, query, db.dialect === 'postgres');\n });\n}\n","/** SQL storage with atomic, change-scoped projections and buffered reads. */\n\nimport type {\n IReadWriteStore,\n IReadOnlyStore,\n IStorage,\n IStorageTransaction,\n StoreName,\n StoreType,\n} from '../contract';\nimport type { DomainQuery, DomainQueryResult } from '../domain';\nimport { stampUserOwned } from '../membership';\nimport { STORE_DEFS, type StoreDef } from '../schema';\nimport {\n isRange,\n keyFromValue,\n rangeFromIDB,\n type KeyDTO,\n type RangeDTO,\n type TxOp,\n} from '../wire';\nimport {\n bufferedGet,\n bufferSlot,\n bufferToOps,\n isDirty,\n overlayRows,\n type BufferEntry,\n} from '../overlay';\nimport {\n countRows,\n getRow,\n initializeStore,\n listRows,\n putRow,\n wipeRows,\n getRows,\n listRowsFromIndexMany,\n} from './store';\nimport {\n handleDomainQuery,\n initializeDomain,\n refreshDomain,\n wipeDomain,\n} from './domain';\nimport { StorageError } from './errors';\nimport { libsqlDatabase, type Database, type SqlConnection } from './connection';\nimport { createClient } from '@libsql/client/web';\nimport { rowsEqual } from '../validation';\n\nexport interface SqlStorageOptions {\n /** Rows in user-owned stores are stamped with this userId on write. Omit\n * for stamp-free writers (data migration preserves ownership verbatim). */\n getUserId?: () => string;\n}\n\nexport class SqlStorage implements IStorage {\n private readonly db: Database;\n private readonly options: SqlStorageOptions;\n private readonly defs: Record<StoreName, StoreDef>;\n private readyPromise?: Promise<void>;\n\n constructor(db: Database, options: SqlStorageOptions = {}) {\n this.db = db;\n this.options = options;\n this.defs = Object.fromEntries(STORE_DEFS.map((d) => [d.name, d])) as Record<StoreName, StoreDef>;\n }\n\n /**\n * Idempotent schema + projection initialization. Cheap when already\n * compatible (both initializers are guard-protected); a failed attempt\n * clears the memo so the next call retries instead of caching the error.\n */\n ready(): Promise<void> {\n this.readyPromise ??= (async () => {\n try {\n await initializeStore(this.db);\n await initializeDomain(this.db);\n } catch (e) {\n this.readyPromise = undefined;\n throw e;\n }\n })();\n return this.readyPromise;\n }\n\n /** Every store operation starts here, so views created before (or during)\n * an in-flight ready() block until initialization actually succeeded. */\n ensureReady(): Promise<void> {\n return this.ready();\n }\n\n def(store: StoreName): StoreDef {\n const def = this.defs[store];\n if (!def) throw new StorageError(404, `SqlStorage: unknown store '${store}'`);\n return def;\n }\n\n private makeView<K extends StoreName>(\n store: K,\n conn: SqlConnection,\n mutable: boolean,\n buffer?: Map<string, BufferEntry>,\n cleared?: Set<StoreName>,\n ): IReadWriteStore<StoreType<K>> {\n return new SqlStore<StoreType<K>>(this, this.def(store), store, conn, mutable, buffer, cleared);\n }\n\n readonly<K extends StoreName>(store: K): IReadOnlyStore<StoreType<K>> {\n return this.makeView(store, this.db, false);\n }\n\n readwrite<K extends StoreName>(store: K): IReadWriteStore<StoreType<K>> {\n return this.makeView(store, this.db, true);\n }\n\n async queryDomain(query: DomainQuery): Promise<DomainQueryResult | undefined> {\n await this.ensureReady();\n try {\n return await handleDomainQuery(this.db, query);\n } catch (e) {\n // Same stale-projection fallback as ApiStorage's 409 mapping.\n if (e instanceof StorageError && e.code === 'domain_projection_unavailable') return undefined;\n throw e;\n }\n }\n\n async transaction<K extends StoreName, R>(\n stores: K[],\n mode: 'readonly' | 'readwrite',\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n await this.ensureReady();\n return this.runTx(stores, mode === 'readwrite', fn);\n }\n\n /** Bulk writes use the same affected-key refresh as ordinary transactions. */\n async bulkTransaction<K extends StoreName, R>(\n stores: K[],\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n await this.ensureReady();\n return this.runTx(stores, true, fn);\n }\n\n private runTx<K extends StoreName, R>(\n stores: K[],\n mutableMode: boolean,\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n const scoped = new Set<StoreName>(stores);\n const buffer = new Map<string, BufferEntry>();\n const cleared = new Set<StoreName>();\n return this.db.transaction(async (conn) => {\n const checkScope = (store: StoreName): void => {\n if (!scoped.has(store)) {\n throw new StorageError(400, `store '${store}' is outside this transaction's scope`, 'store_out_of_scope');\n }\n };\n const tx: IStorageTransaction = {\n readonly: <S extends StoreName>(store: S) => {\n checkScope(store);\n return this.makeView(store, conn, false, buffer, cleared);\n },\n readwrite: <S extends StoreName>(store: S) => {\n checkScope(store);\n if (!mutableMode) {\n throw new StorageError(403, 'transaction was opened readonly', 'read_only_transaction');\n }\n return this.makeView(store, conn, true, buffer, cleared);\n },\n };\n const result = await fn(tx);\n const ops = bufferToOps(STORE_DEFS.map((d) => d.name), buffer, cleared);\n if (ops.length > 0) {\n await refreshDomain(conn, ops);\n }\n return result;\n });\n }\n\n /**\n * Proves the backend accepts writes: one real INSERT into `meta` inside a\n * transaction that is then deliberately rolled back — zero rows committed.\n * A read-only backend, bad token or transport failure rejects here.\n */\n async verifyWritable(): Promise<void> {\n await this.ensureReady();\n const sentinel = new Error('verifyWritable: deliberate rollback sentinel');\n try {\n await this.db.transaction(async (conn) => {\n await putRow(conn, this.def('meta'), {\n key: `__wodwiki_write_check_${crypto.randomUUID()}`,\n value: '',\n });\n throw sentinel;\n });\n } catch (e) {\n if (e !== sentinel) throw e;\n }\n }\n\n async wipe(): Promise<void> {\n await this.ensureReady();\n await this.db.transaction(async (tx) => {\n await wipeRows(tx);\n await wipeDomain(tx);\n });\n }\n\n async close(): Promise<void> {\n await this.db.close();\n }\n\n // Internal seam for SqlStore views (same module): immediate op application\n // and write stamping.\n async applyOps(ops: TxOp[]): Promise<void> {\n await this.db.transaction((tx) => refreshDomain(tx, ops));\n }\n\n stamp(store: StoreName, value: unknown): unknown {\n const userId = this.options.getUserId?.();\n return userId ? stampUserOwned(store, value, userId) : value;\n }\n}\n\n/**\n * Store view over a SqlConnection. Outside a transaction writes apply\n * immediately (each in its own SQL tx with projection refresh); inside one,\n * writes buffer and reads overlay the buffer on committed rows. All\n * operations await backend readiness first.\n */\nclass SqlStore<T> implements IReadWriteStore<T> {\n constructor(\n private readonly owner: SqlStorage,\n private readonly def: StoreDef,\n private readonly store: StoreName,\n private readonly conn: SqlConnection,\n private readonly mutable: boolean,\n private readonly buffer?: Map<string, BufferEntry>,\n private readonly cleared?: Set<StoreName>,\n ) {}\n\n private assertMutable(): void {\n if (!this.mutable) {\n throw new StorageError(403, `${this.store} is opened read-only`, 'read_only_view');\n }\n }\n\n async get(key: IDBValidKey | RangeDTO): Promise<T | undefined> {\n await this.owner.ensureReady();\n const k = this.pointKey(key);\n const state = bufferedGet<T>(this.store, k, this.buffer);\n if (state) return state.hit ? state.value : undefined;\n if (this.cleared?.has(this.store)) return undefined;\n return getRow(this.conn, this.def, k) as Promise<T | undefined>;\n }\n\n async getMany(keys: IDBValidKey[]): Promise<(T | undefined)[]> {\n await this.owner.ensureReady();\n const normalized = keys.map(key => this.pointKey(key));\n const committed = this.cleared?.has(this.store) ? keys.map(() => undefined)\n : await getRows(this.conn, this.def, normalized) as (T | undefined)[];\n return normalized.map((key, i) => {\n const state = bufferedGet<T>(this.store, key, this.buffer);\n return state ? (state.hit ? state.value : undefined) : committed[i];\n });\n }\n\n async getAllFromIndexMany(indexName: string, keys: IDBValidKey[]): Promise<T[][]> {\n await this.owner.ensureReady();\n const rows = await listRowsFromIndexMany(this.conn, this.def, indexName, keys.map(key => this.pointKey(key)));\n return rows.map((values, i) => overlayRows<T>(this.def, this.store, this.buffer, this.cleared, values as T[], undefined, { only: this.pointKey(keys[i]) }, indexName));\n }\n\n async getAll(query?: IDBValidKey | IDBKeyRange | RangeDTO, count?: number): Promise<T[]> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n const rows = await listRows(this.conn, this.def, range, isDirty(this.store, this.buffer, this.cleared) ? undefined : count);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], count, range);\n }\n\n async getAllFromIndex(indexName: string, query?: IDBValidKey | IDBKeyRange | RangeDTO, count?: number): Promise<T[]> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n const rows = await listRows(this.conn, this.def, range, isDirty(this.store, this.buffer, this.cleared) ? undefined : count, indexName);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], count, range, indexName);\n }\n\n async count(query?: IDBValidKey | IDBKeyRange | RangeDTO): Promise<number> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n if (!isDirty(this.store, this.buffer, this.cleared)) return countRows(this.conn, this.def, range);\n const rows = await listRows(this.conn, this.def, range);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], undefined, range).length;\n }\n\n async countFromIndex(indexName: string, query?: IDBValidKey | IDBKeyRange | RangeDTO): Promise<number> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n if (!isDirty(this.store, this.buffer, this.cleared)) return countRows(this.conn, this.def, range, indexName);\n const rows = await listRows(this.conn, this.def, range, undefined, indexName);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], undefined, range, indexName).length;\n }\n\n async put(value: T, _key?: IDBValidKey): Promise<IDBValidKey> {\n await this.owner.ensureReady();\n this.assertMutable();\n const stored = this.owner.stamp(this.store, value) as T;\n const key = keyFromValue(this.def, stored);\n if (this.store === 'block_revisions') {\n const previous = this.buffer?.get(bufferSlot(this.store, key));\n if (previous?.kind === 'put' && !rowsEqual(previous.value, stored)) throw new StorageError(409, 'immutable block revision collision', 'revision_conflict');\n }\n if (this.buffer) {\n this.buffer.set(bufferSlot(this.store, key), { kind: 'put', value: stored });\n return key;\n }\n await this.owner.applyOps([{ op: 'put', store: this.store, value: stored }]);\n return key;\n }\n\n async putMany(values: T[], _keys?: IDBValidKey[]): Promise<IDBValidKey[]> {\n await this.owner.ensureReady();\n this.assertMutable();\n const stored = values.map(value => this.owner.stamp(this.store, value) as T);\n const keys = stored.map(value => keyFromValue(this.def, value));\n if (this.store === 'block_revisions') {\n const seen = new Map<string, unknown>();\n keys.forEach((key, i) => {\n const slot = bufferSlot(this.store, key), previous = this.buffer?.get(slot);\n const value = seen.has(slot) ? seen.get(slot) : previous?.kind === 'put' ? previous.value : undefined;\n if (value !== undefined && !rowsEqual(value, stored[i])) throw new StorageError(409, 'immutable block revision collision', 'revision_conflict');\n seen.set(slot, stored[i]);\n });\n }\n if (this.buffer) keys.forEach((key, i) => this.buffer!.set(bufferSlot(this.store, key), { kind: 'put', value: stored[i] }));\n else await this.owner.applyOps(stored.map(value => ({ op: 'put', store: this.store, value })));\n return keys;\n }\n\n async delete(key: IDBValidKey | IDBKeyRange | RangeDTO): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\n if (this.store === 'block_revisions') throw new StorageError(409, 'block history requires explicit wipe', 'revision_conflict');\n const range = isRange(key) ? key : undefined;\n const target = range ?? (key as KeyDTO);\n if (this.buffer) {\n if (range) {\n for (const row of await this.getAll(range)) {\n const rowKey = keyFromValue(this.def, row);\n this.buffer.set(bufferSlot(this.store, rowKey), { kind: 'delete', key: rowKey });\n }\n return;\n }\n const point = target as KeyDTO;\n this.buffer.set(bufferSlot(this.store, point), { kind: 'delete', key: point });\n return;\n }\n await this.owner.applyOps([{ op: 'delete', store: this.store, key: target as KeyDTO }]);\n }\n\n async clear(): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\n if (this.store === 'block_revisions') throw new StorageError(409, 'block history requires explicit wipe', 'revision_conflict');\n if (this.buffer) {\n this.cleared?.add(this.store);\n const prefix = `${this.store}\\u0000`;\n for (const slot of [...this.buffer.keys()]) {\n if (slot.startsWith(prefix)) this.buffer.delete(slot);\n }\n return;\n }\n await this.owner.applyOps([{ op: 'clear', store: this.store }]);\n }\n\n /** Normalizes get() arguments to a wire key (bounded ranges match no row). */\n private pointKey(key: IDBValidKey | RangeDTO): KeyDTO {\n if (isRange(key)) {\n if (key.only === undefined) {\n throw new StorageError(400, 'get() needs a plain key or {only}; bounded ranges match no single row');\n }\n return key.only;\n }\n return key as KeyDTO;\n }\n}\n\nexport interface TursoSettings {\n url: string;\n authToken?: string;\n}\n\n/** libsql/https/wss only; plain http only for loopback development; tokens\n * travel via authToken, never the URL. Rejects credentials, query strings\n * and fragments (no secret or option injection through the URL). */\nexport function validateTursoUrl(url: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new StorageError(400, 'invalid Turso URL', 'bad_turso_url');\n }\n if (url.includes('?') || url.includes('#')) {\n throw new StorageError(400, 'Turso URL must not carry a query or fragment; pass options/secrets via authToken', 'bad_turso_url');\n }\n if (parsed.username || parsed.password) {\n throw new StorageError(400, 'Turso URL must not embed credentials; pass them via authToken', 'bad_turso_url');\n }\n const loopback = parsed.hostname === '127.0.0.1' || parsed.hostname === 'localhost' || parsed.hostname === '[::1]';\n if (parsed.protocol === 'http:') {\n if (!loopback) {\n throw new StorageError(400, 'refusing plain http Turso URL (token would traverse the network unencrypted); use libsql:/https:', 'bad_turso_url');\n }\n return url;\n }\n if (parsed.protocol !== 'libsql:' && parsed.protocol !== 'https:' && parsed.protocol !== 'wss:') {\n throw new StorageError(400, `unsupported Turso URL scheme ${parsed.protocol} (expected libsql:, https:, wss:)`, 'bad_turso_url');\n }\n return url;\n}\n\n/**\n * Direct-from-browser Turso backend. Construction only validates and builds\n * the client; `await storage.ready()` initializes schema + projections.\n * Errors never embed the auth token.\n */\nexport class BrowserTursoStorage extends SqlStorage {\n constructor(settings: TursoSettings, options: SqlStorageOptions = {}) {\n super(\n libsqlDatabase(createClient({ url: validateTursoUrl(settings.url), authToken: settings.authToken })),\n options,\n );\n }\n}\n","/**\n * Turso backup/sync protocol — the local-first sync tables layered on top of\n * any libsql database. The browser data plane is always IndexedDB; a saved\n * Turso target is a backup/sync destination, never the read/write provider.\n *\n * Design: the remote holds ONE op log (`_wodwiki_sync_ops`) plus a state row\n * (`_wodwiki_sync_state`) carrying {schema, rev}. Every committed local\n * transaction group appends one idempotent op-group (uuid op_id,\n * INSERT-or-ignore per op); `rev` is assigned monotonically per NEWLY applied\n * group — a retried group is recognized by its first op id, consumes no rev\n * and appends nothing. Pulls replay ops with rev > cursor in deterministic\n * (rev, idx) order. Tombstones (delete/clear/wipe) are ordinary ops —\n * deletions propagate.\n *\n * Fetch atomicity: a pull window is a set of WHOLE revision groups. The rev\n * boundary is chosen with a bounded subquery, then every row of those revs is\n * returned — a group is never split, so the cursor never skips the rest of\n * a group (one pathologically large group can exceed the nominal row bound;\n * that is the unavoidable atomicity ceiling).\n *\n * ponytail: op-log replay pulls — a fresh browser replays the whole log\n * (O(history)) instead of reading per-store current-state tables. Upgrade\n * path: add per-store state tables rev-indexed by primary key and collapse\n * the log into them periodically; the wire format (op_id, rev, mutation)\n * stays unchanged.\n *\n * Never-downgrade rule: the state row's `schema` is the managing client's\n * DB_VERSION at init time. Uploads verify `schema` INSIDE the write\n * transaction (a stale probe must not append current payloads to an old or\n * newer remote); an older remote log is migrated forward by the caller\n * (transform payloads, never just rewrite the marker), a newer remote is\n * never rewritten — the client refuses and keeps working locally.\n */\n\nimport { STORE_DEFS } from '../schema';\nimport type { StoreName } from '../contract';\nimport type { KeyDTO, Scalar } from '../wire';\nimport { decodeRowJson, encodeRowJson } from './codec';\nimport { StorageError } from './errors';\nimport { SCHEMA_TABLE } from './store';\nimport type { Database, SqlConnection, SqlStatement } from './connection';\n\nexport const SYNC_OPS_TABLE = '_wodwiki_sync_ops';\nexport const SYNC_STATE_TABLE = '_wodwiki_sync_state';\n/** Pre-migration op log copies live here — the recoverable old source,\n * retained after a schema migration replaces the active log. */\nexport const SYNC_ARCHIVE_TABLE = '_wodwiki_sync_ops_archive';\n\n/** One committed local transaction group, as journaled in IndexedDB. */\nexport type SyncMutation =\n | { op: 'put'; store: StoreName; key: KeyDTO; value: unknown }\n | { op: 'delete'; store: StoreName; key: KeyDTO }\n | { op: 'clear'; store: StoreName }\n | { op: 'wipe' };\n\nexport interface SyncEntry {\n /** Idempotency key — one uuid per committed local transaction group. */\n id: string;\n at: number;\n ops: SyncMutation[];\n}\n\nexport interface StoredSyncOp {\n opId: string;\n rev: number;\n idx: number;\n at: number;\n mutation: SyncMutation;\n}\n\nexport type SyncTargetKind =\n /** No tables at all (beyond libsql internals): fresh database. */\n | 'empty'\n /** Tables exist but neither sync state nor a legacy schema guard — not\n * ours; initializing over unknown data is refused by the caller. */\n | { kind: 'unknown' }\n /** Legacy direct-Turso SqlStorage layout (`_wodwiki_schema` guard). */\n | { kind: 'legacy'; schemaVersion: number }\n /** This sync protocol's layout; payload = state row. */\n | { kind: 'current'; schemaVersion: number; rev: number };\n\ninterface SyncStateRow {\n schema: number;\n rev: number;\n}\n\n/** Stores whose rows carry a raw binary field the codec must preserve. */\nconst BINARY_FIELD: Record<string, string> = { attachments: 'data' };\n\nconst STORE_NAMES: Record<string, true> = Object.fromEntries(STORE_DEFS.map((d) => [d.name, true]));\n\nconst STATE_KEY = 'meta';\n\nfunction isSafeInt(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value);\n}\n\nfunction isScalar(value: unknown): value is Scalar {\n return typeof value === 'string' || (typeof value === 'number' && Number.isFinite(value));\n}\n\n/** Trust-boundary key check — mirrors wire.validateKey (kept local to keep\n * the sql subpath free of runtime wire imports beyond types). */\nfunction assertKey(key: unknown, what: string): asserts key is KeyDTO {\n if (isScalar(key)) return;\n if (Array.isArray(key) && key.length > 0 && key.every(isScalar)) return;\n throw new StorageError(400, `${what} must be a string, finite number, or non-empty scalar tuple`, 'bad_sync_key');\n}\n\n/** Validate one decoded mutation at the external-data trust boundary. */\nfunction validateMutation(raw: unknown): SyncMutation {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new StorageError(400, 'sync mutation must be an object', 'bad_sync_mutation');\n }\n const mutation = raw as Record<string, unknown>;\n if (mutation.op === 'wipe') return { op: 'wipe' };\n if (typeof mutation.store !== 'string' || !STORE_NAMES[mutation.store]) {\n throw new StorageError(400, `sync mutation has unknown store ${String(mutation.store)}`, 'bad_sync_mutation');\n }\n const store = mutation.store as StoreName;\n if (mutation.op === 'clear') return { op: 'clear', store };\n if (mutation.op === 'delete') {\n assertKey(mutation.key, 'sync delete key');\n return { op: 'delete', store, key: mutation.key };\n }\n if (mutation.op === 'put') {\n assertKey(mutation.key, 'sync put key');\n if (mutation.value === null || typeof mutation.value !== 'object' || Array.isArray(mutation.value)) {\n throw new StorageError(400, 'sync put value must be an object row', 'bad_sync_mutation');\n }\n return { op: 'put', store, key: mutation.key, value: mutation.value };\n }\n throw new StorageError(400, `sync mutation has unknown op ${String(mutation.op)}`, 'bad_sync_mutation');\n}\n\nfunction validateEntry(entry: SyncEntry): void {\n if (typeof entry.id !== 'string' || entry.id.length === 0 || entry.id.length > 200) {\n throw new StorageError(400, 'sync entry id must be a non-empty string', 'bad_sync_entry');\n }\n if (!isSafeInt(entry.at) || entry.at < 0) {\n throw new StorageError(400, 'sync entry at must be a non-negative safe integer', 'bad_sync_entry');\n }\n if (!Array.isArray(entry.ops) || entry.ops.length === 0) {\n throw new StorageError(400, 'sync entry ops must be a non-empty array', 'bad_sync_entry');\n }\n for (const op of entry.ops) validateMutation(op);\n}\n\n/** Run statements inside a transaction, preferring one native batch. */\nasync function runStatements(tx: SqlConnection, statements: SqlStatement[]): Promise<unknown[][]> {\n if (statements.length === 0) return [];\n if (tx.batch) return tx.batch(statements);\n const results: unknown[][] = [];\n for (const statement of statements) {\n results.push(await tx.query(statement.sql, statement.params ?? []));\n }\n return results;\n}\n\nasync function tableExists(conn: SqlConnection, dialect: Database['dialect'], name: string): Promise<boolean> {\n const sql = dialect === 'postgres'\n ? `SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_name = $1`\n : `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`;\n return (await conn.query(sql, [name])).length > 0;\n}\n\n/** Read + validate the sync state row (trusted shape afterwards). */\nasync function readSyncState(tx: SqlConnection): Promise<SyncStateRow> {\n const rows = await tx.query(`SELECT \"value\" FROM \"${SYNC_STATE_TABLE}\" WHERE \"key\" = ?`, [STATE_KEY]);\n if (!rows[0]) throw new StorageError(409, 'sync target is not initialized', 'sync_not_initialized');\n let parsed: unknown;\n try {\n parsed = JSON.parse(String(rows[0].value));\n } catch {\n throw new StorageError(400, 'malformed sync state row', 'bad_sync_state');\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new StorageError(400, 'malformed sync state row', 'bad_sync_state');\n }\n const state = parsed as Record<string, unknown>;\n if (!isSafeInt(state.schema) || state.schema < 0 || !isSafeInt(state.rev) || state.rev < 0) {\n throw new StorageError(400, 'sync state schema/rev must be non-negative safe integers', 'bad_sync_state');\n }\n return { schema: state.schema, rev: state.rev };\n}\n\n/** Classify the sync target WITHOUT mutating it. */\nexport async function probeSyncTarget(db: Database): Promise<SyncTargetKind> {\n if (await tableExists(db, db.dialect, SYNC_STATE_TABLE)) {\n const state = await readSyncState(db);\n return { kind: 'current', schemaVersion: state.schema, rev: state.rev };\n }\n if (await tableExists(db, db.dialect, SCHEMA_TABLE)) {\n const rows = await db.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = 'schema'`);\n if (rows[0]) {\n const guard = JSON.parse(String(rows[0].value)) as { version?: unknown };\n if (typeof guard.version === 'number' && Number.isSafeInteger(guard.version) && guard.version >= 0) {\n return { kind: 'legacy', schemaVersion: guard.version };\n }\n }\n return { kind: 'legacy', schemaVersion: 0 };\n }\n // Fresh-vs-unknown: any user table we do not own means foreign data.\n const others = await db.query(\n db.dialect === 'postgres'\n ? `SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'`\n : `SELECT name FROM sqlite_master WHERE type = 'table'`,\n );\n const internal = (name: string): boolean => name.startsWith('_wodwiki_') || name.startsWith('sqlite_');\n return others.some((row) => !internal(String(Object.values(row)[0]))) ? { kind: 'unknown' } : 'empty';\n}\n\n/** Create the sync tables + state row. Only for empty targets; existing\n * state (current, legacy or unknown) is never overwritten by init. */\nexport async function initSyncTarget(db: Database, schemaVersion: number): Promise<void> {\n await db.transaction(async (tx) => {\n await tx.exec(`CREATE TABLE IF NOT EXISTS \"${SYNC_STATE_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`);\n await tx.exec(\n `CREATE TABLE IF NOT EXISTS \"${SYNC_OPS_TABLE}\" (` +\n `\"op_id\" TEXT PRIMARY KEY, \"rev\" INTEGER NOT NULL, \"idx\" INTEGER NOT NULL, \"at\" INTEGER NOT NULL, \"data\" TEXT NOT NULL)`,\n );\n await tx.exec(\n `CREATE INDEX IF NOT EXISTS \"${SYNC_OPS_TABLE}_rev\" ON \"${SYNC_OPS_TABLE}\" (\"rev\", \"idx\")`,\n );\n await tx.exec(\n `INSERT INTO \"${SYNC_STATE_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO NOTHING`,\n [STATE_KEY, JSON.stringify({ schema: schemaVersion, rev: 0 } satisfies SyncStateRow)],\n );\n });\n}\n\nfunction encodeMutation(mutation: SyncMutation): string {\n if (mutation.op !== 'put') return JSON.stringify(mutation);\n // The binary codec applies to the ROW (mutation.value), not the mutation\n // envelope — attachments.data carries the raw bytes.\n const encoded = encodeRowJson(mutation.value, BINARY_FIELD[mutation.store]);\n return `{\"key\":${JSON.stringify(mutation.key)},\"op\":\"put\",\"store\":${JSON.stringify(mutation.store)},\"value\":${encoded}}`;\n}\n\n/** Decode + validate one stored op payload at the external-data boundary. */\nfunction decodeMutation(data: unknown): SyncMutation {\n if (typeof data !== 'string') {\n throw new StorageError(400, 'sync op data must be a string', 'bad_sync_mutation');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n throw new StorageError(400, 'sync op data is not valid JSON', 'bad_sync_mutation');\n }\n const mutation = validateMutation(parsed);\n if (mutation.op !== 'put') return mutation;\n return {\n op: 'put',\n store: mutation.store,\n key: mutation.key,\n value: decodeRowJson(JSON.stringify(mutation.value), BINARY_FIELD[mutation.store]),\n };\n}\n\nexport interface ApplySyncBatchOptions {\n /** Schema the caller verified at probe time — rechecked INSIDE the write\n * transaction so a schema change between probe and append aborts. */\n expectSchema?: number;\n /** Bump the state schema version in the SAME transaction (remote-schema\n * migrations append converted payloads + move the marker atomically). */\n toSchemaVersion?: number;\n}\n\n/**\n * Append op-groups to the log in ONE SQL transaction, idempotently by\n * group: a group whose first op id already exists is skipped entirely and\n * consumes no rev (retries never duplicate, never allocate revisions).\n * Returns the number of NEW groups committed — ack semantics for the\n * uploader's watermark.\n */\nexport async function applySyncBatch(\n db: Database,\n entries: SyncEntry[],\n opts: ApplySyncBatchOptions = {},\n): Promise<number> {\n if (entries.length === 0) return 0;\n for (const entry of entries) validateEntry(entry);\n return db.transaction(async (tx) => {\n const state = await readSyncState(tx);\n if (opts.expectSchema !== undefined && state.schema !== opts.expectSchema) {\n throw new StorageError(\n 409,\n `sync target schema changed from v${opts.expectSchema} to v${state.schema} between probe and write — retry the cycle`,\n 'sync_schema_conflict',\n );\n }\n // Group presence: one lookup on every group's first op id. Groups are\n // written whole by construction, so first-op presence ⇔ group present.\n const firstIds = entries.map((entry) => `${entry.id}:0`);\n const present = new Set<string>();\n for (let i = 0; i < firstIds.length; i += 100) {\n const chunk = firstIds.slice(i, i + 100);\n const rows = await tx.query(\n `SELECT \"op_id\" FROM \"${SYNC_OPS_TABLE}\" WHERE \"op_id\" IN (${chunk.map(() => '?').join(', ')})`,\n chunk,\n );\n for (const row of rows) present.add(String(row.op_id));\n }\n const statements: SqlStatement[] = [];\n let rev = state.rev;\n let committed = 0;\n for (const entry of entries) {\n if (present.has(`${entry.id}:0`)) continue;\n rev += 1;\n committed += 1;\n entry.ops.forEach((mutation, idx) => {\n statements.push({\n sql:\n `INSERT INTO \"${SYNC_OPS_TABLE}\" (\"op_id\", \"rev\", \"idx\", \"at\", \"data\") VALUES (?, ?, ?, ?, ?) ` +\n `ON CONFLICT (\"op_id\") DO NOTHING`,\n params: [`${entry.id}:${idx}`, rev, idx, entry.at, encodeMutation(mutation)],\n });\n });\n }\n const nextSchema = opts.toSchemaVersion ?? state.schema;\n statements.push({\n sql: `UPDATE \"${SYNC_STATE_TABLE}\" SET \"value\" = ? WHERE \"key\" = ?`,\n params: [JSON.stringify({ schema: nextSchema, rev } satisfies SyncStateRow), STATE_KEY],\n });\n await runStatements(tx, statements);\n return committed;\n });\n}\n\n/**\n * Replay window: ops with rev > afterRev, in deterministic commit order.\n * The window covers WHOLE revision groups: up to `limit` distinct revs are\n * chosen (bounded subquery), then every row of those revs is returned, so a\n * cursor advanced to the last returned rev never splits a group. A single\n * group larger than `limit` is returned whole — the atomicity ceiling.\n */\nexport async function fetchSyncOps(db: Database, afterRev: number, limit: number): Promise<StoredSyncOp[]> {\n if (!isSafeInt(afterRev) || afterRev < 0) {\n throw new StorageError(400, 'fetchSyncOps cursor must be a non-negative safe integer', 'bad_sync_cursor');\n }\n const bounded = Math.min(Math.max(1, Math.floor(limit)), 0xffffffff);\n const revRows = await db.query(\n `SELECT DISTINCT \"rev\" FROM (SELECT \"rev\" FROM \"${SYNC_OPS_TABLE}\" WHERE \"rev\" > ? ORDER BY \"rev\" ASC LIMIT ?)`,\n [afterRev, bounded],\n );\n const revs = revRows.map((row) => {\n const rev = Number(row.rev);\n if (!Number.isSafeInteger(rev) || rev < 0) {\n throw new StorageError(400, 'sync op rev must be a non-negative safe integer', 'bad_sync_row');\n }\n return rev;\n });\n if (revs.length === 0) return [];\n const rows = await db.query(\n `SELECT \"op_id\", \"rev\", \"idx\", \"at\", \"data\" FROM \"${SYNC_OPS_TABLE}\" WHERE \"rev\" IN (${revs.map(() => '?').join(', ')}) ORDER BY \"rev\", \"idx\"`,\n revs,\n );\n return rows.map((row, at) => {\n const opId = row.op_id;\n const rev = Number(row.rev);\n const idx = Number(row.idx);\n const atMs = Number(row.at);\n if (typeof opId !== 'string' || opId.length === 0 || !Number.isSafeInteger(rev) || rev < 0\n || !Number.isSafeInteger(idx) || idx < 0 || !Number.isSafeInteger(atMs) || atMs < 0) {\n throw new StorageError(400, `sync op row ${at} has malformed shape`, 'bad_sync_row');\n }\n return { opId, rev, idx, at: atMs, mutation: decodeMutation(row.data) };\n });\n}\n\n/**\n * Schema-migration replacement for the active op log, in ONE transaction:\n * every previous op is copied into the archive table (the recoverable old\n * source — nothing is destroyed), the active log is cleared, and the\n * converted snapshot groups become the entire replayable history at\n * rev 1..n with the schema marker moved forward atomically. Fresh browsers\n * replay converted payloads only, so pulls never touch legacy row shapes.\n */\nexport async function replaceSyncLog(db: Database, entries: SyncEntry[], toSchemaVersion: number): Promise<void> {\n if (entries.length === 0) throw new StorageError(400, 'replacement log must contain the converted snapshot', 'bad_sync_entry');\n for (const entry of entries) validateEntry(entry);\n await db.transaction(async (tx) => {\n await readSyncState(tx); // target must be initialized (throws otherwise)\n await tx.exec(\n `CREATE TABLE IF NOT EXISTS \"${SYNC_ARCHIVE_TABLE}\" (` +\n `\"op_id\" TEXT PRIMARY KEY, \"rev\" INTEGER NOT NULL, \"idx\" INTEGER NOT NULL, \"at\" INTEGER NOT NULL, \"data\" TEXT NOT NULL)`,\n );\n await tx.exec(`INSERT INTO \"${SYNC_ARCHIVE_TABLE}\" (\"op_id\", \"rev\", \"idx\", \"at\", \"data\") SELECT \"op_id\", \"rev\", \"idx\", \"at\", \"data\" FROM \"${SYNC_OPS_TABLE}\"`);\n await tx.exec(`DELETE FROM \"${SYNC_OPS_TABLE}\"`);\n const statements: SqlStatement[] = [];\n let rev = 0;\n for (const entry of entries) {\n rev += 1;\n entry.ops.forEach((mutation, idx) => {\n statements.push({\n sql:\n `INSERT INTO \"${SYNC_OPS_TABLE}\" (\"op_id\", \"rev\", \"idx\", \"at\", \"data\") VALUES (?, ?, ?, ?, ?) ` +\n `ON CONFLICT (\"op_id\") DO NOTHING`,\n params: [`${entry.id}:${idx}`, rev, idx, entry.at, encodeMutation(mutation)],\n });\n });\n }\n statements.push({\n sql: `UPDATE \"${SYNC_STATE_TABLE}\" SET \"value\" = ? WHERE \"key\" = ?`,\n params: [JSON.stringify({ schema: toSchemaVersion, rev } satisfies SyncStateRow), STATE_KEY],\n });\n await runStatements(tx, statements);\n });\n}\n\n/** Migration-only raw replay: parsed op payloads WITHOUT store/key validation\n * (old logs reference era store names like `segments`). Only\n * migrateRemoteToCurrent consumes this — pulls use fetchSyncOps, which\n * validates every row against the current schema. Binary cells revive. */\nexport interface RawSyncOp {\n op: string;\n store: string;\n key: unknown;\n value?: unknown;\n}\n\nexport async function readRawSyncOps(db: Database): Promise<RawSyncOp[]> {\n const rows = await db.query(`SELECT \"rev\", \"idx\", \"data\" FROM \"${SYNC_OPS_TABLE}\" ORDER BY \"rev\", \"idx\"`);\n return rows.map((row) => {\n const rev = Number(row.rev);\n const idx = Number(row.idx);\n if (!Number.isSafeInteger(rev) || rev < 0 || !Number.isSafeInteger(idx) || idx < 0 || typeof row.data !== 'string') {\n throw new StorageError(400, 'sync op row has malformed shape', 'bad_sync_row');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(row.data);\n } catch {\n throw new StorageError(400, 'sync op data is not valid JSON', 'bad_sync_row');\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new StorageError(400, 'sync op data must be an object', 'bad_sync_row');\n }\n const mutation = parsed as Record<string, unknown>;\n if (typeof mutation.op !== 'string' || typeof mutation.store !== 'string') {\n throw new StorageError(400, 'sync op must carry string op/store', 'bad_sync_row');\n }\n return {\n op: mutation.op,\n store: mutation.store,\n key: mutation.key,\n value: mutation.value === undefined || mutation.value === null\n ? undefined\n : decodeRowJson(JSON.stringify(mutation.value), BINARY_FIELD[mutation.store]),\n };\n });\n}\n\n/**\n * Import rows from a legacy direct-Turso (SqlStorage) database into op-\n * groups. Reads the per-store JSON `data` columns directly — the legacy\n * schema guard may hold an older version SqlStorage refuses to open, so the\n * rows are lifted raw, never through SqlStorage. Missing tables contribute\n * no rows; nothing is written or deleted remotely.\n */\nexport async function readLegacyRows(db: Database, table: string): Promise<unknown[]> {\n if (!(await tableExists(db, db.dialect, table))) return [];\n const rows = await db.query(`SELECT \"data\" FROM \"${table}\"`);\n return rows.map((row) => decodeRowJson(String(row.data), BINARY_FIELD[table]));\n}\n"]}
|