@fireproof/core 0.3.13 → 0.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/clock.js","../../src/crypto.js","../../src/sha1.js","../../src/valet.js","../../src/blockstore.js","../../src/prolly.js","../../src/fireproof.js","../../src/db-index.js","../../src/listener.js","../../src/hydrator.js"],"sourcesContent":["import { Block, encode, decode } from 'multiformats/block'\nimport { sha256 } from 'multiformats/hashes/sha2'\nimport * as cbor from '@ipld/dag-cbor'\n// @ts-ignore\nimport { CIDCounter } from 'prolly-trees/utils'\n\n/**\n * @template T\n * @typedef {{ parents: EventLink<T>[], data: T }} EventView\n */\n\n/**\n * @template T\n * @typedef {import('multiformats').BlockView<EventView<T>>} EventBlockView\n */\n\n/**\n * @template T\n * @typedef {import('multiformats').Link<EventView<T>>} EventLink\n */\n\n/**\n * @typedef {{\n* type: 'put'|'del'\n* key: string\n* value: import('./link').AnyLink\n* root: import('./link').AnyLink\n* }} EventData\n* @typedef {{\n* root: import('./link').AnyLink\n* head: import('./clock').EventLink<EventData>[]\n* event: import('./clock').EventBlockView<EventData>\n* }} Result\n*/\n\n/**\n * Advance the clock by adding an event.\n *\n * @template T\n * @param {import('./blockstore').TransactionBlockstore} blocks Block storage.\n * @param {EventLink<T>[]} head The head of the clock.\n * @param {EventLink<T>} event The event to add.\n * @returns {Promise<{head:EventLink<T>[], cids:any[]}>} The new head of the clock.\n */\nexport async function advance (blocks, head, event) {\n /** @type {EventFetcher<T>} */\n const events = new EventFetcher(blocks)\n const headmap = new Map(head.map((cid) => [cid.toString(), cid]))\n\n // Check if the headmap already includes the event, return head if it does\n if (headmap.has(event.toString())) return { head, cids: await events.all() }\n\n // Does event contain the clock?\n let changed = false\n for (const cid of head) {\n if (await contains(events, event, cid)) {\n headmap.delete(cid.toString())\n headmap.set(event.toString(), event)\n changed = true\n }\n }\n\n // If the headmap has been changed, return the new headmap values\n if (changed) {\n return { head: [...headmap.values()], cids: await events.all() }\n }\n\n // Does clock contain the event?\n for (const p of head) {\n if (await contains(events, p, event)) {\n return { head, cids: await events.all() }\n }\n }\n\n // Return the head concatenated with the new event if it passes both checks\n return { head: head.concat(event), cids: await events.all() }\n}\n\n/**\n * @template T\n * @implements {EventBlockView<T>}\n */\nexport class EventBlock extends Block {\n /**\n * @param {object} config\n * @param {EventLink<T>} config.cid\n * @param {Event} config.value\n * @param {Uint8Array} config.bytes\n */\n constructor ({ cid, value, bytes }) {\n // @ts-expect-error\n super({ cid, value, bytes })\n }\n\n /**\n * @template T\n * @param {T} data\n * @param {EventLink<T>[]} [parents]\n */\n static create (data, parents) {\n return encodeEventBlock({ data, parents: parents ?? [] })\n }\n}\n\n/** @template T */\nexport class EventFetcher {\n /** @param {import('./blockstore').TransactionBlockstore} blocks */\n constructor (blocks) {\n /** @private */\n this._blocks = blocks\n this._cids = new CIDCounter()\n this._cache = new Map()\n }\n\n /**\n * @param {EventLink<T>} link\n * @returns {Promise<EventBlockView<T>>}\n */\n async get (link) {\n const slink = link.toString()\n // console.log('get', link.toString())\n if (this._cache.has(slink)) return this._cache.get(slink)\n const block = await this._blocks.get(link)\n this._cids.add({ address: link })\n if (!block) throw new Error(`missing block: ${link}`)\n const got = decodeEventBlock(block.bytes)\n this._cache.set(slink, got)\n return got\n }\n\n async all () {\n // await Promise.all([...this._cids])\n return this._cids.all()\n }\n}\n\n/**\n * @template T\n * @param {EventView<T>} value\n * @returns {Promise<EventBlockView<T>>}\n */\nexport async function encodeEventBlock (value) {\n // TODO: sort parents\n const { cid, bytes } = await encode({ value, codec: cbor, hasher: sha256 })\n // @ts-expect-error\n return new Block({ cid, value, bytes })\n}\n\n/**\n * @template T\n * @param {Uint8Array} bytes\n * @returns {Promise<EventBlockView<T>>}\n */\nexport async function decodeEventBlock (bytes) {\n const { cid, value } = await decode({ bytes, codec: cbor, hasher: sha256 })\n // @ts-expect-error\n return new Block({ cid, value, bytes })\n}\n\n/**\n * Returns true if event \"a\" contains event \"b\". Breadth first search.\n * @template T\n * @param {EventFetcher} events\n * @param {EventLink<T>} a\n * @param {EventLink<T>} b\n */\nasync function contains (events, a, b) {\n if (a.toString() === b.toString()) return true\n const [{ value: aevent }, { value: bevent }] = await Promise.all([events.get(a), events.get(b)])\n const links = [...aevent.parents]\n while (links.length) {\n const link = links.shift()\n if (!link) break\n if (link.toString() === b.toString()) return true\n // if any of b's parents are this link, then b cannot exist in any of the\n // tree below, since that would create a cycle.\n if (bevent.parents.some((p) => link.toString() === p.toString())) continue\n const { value: event } = await events.get(link)\n links.push(...event.parents)\n }\n return false\n}\n\n/**\n * @template T\n * @param {import('./blockstore').TransactionBlockstore} blocks Block storage.\n * @param {EventLink<T>[]} head\n * @param {object} [options]\n * @param {(b: EventBlockView<T>) => string} [options.renderNodeLabel]\n */\nexport async function * vis (blocks, head, options = {}) {\n // @ts-ignore\n const renderNodeLabel = options.renderNodeLabel ?? ((b) => b.value.data.value)\n const events = new EventFetcher(blocks)\n yield 'digraph clock {'\n yield ' node [shape=point fontname=\"Courier\"]; head;'\n const hevents = await Promise.all(head.map((link) => events.get(link)))\n const links = []\n const nodes = new Set()\n for (const e of hevents) {\n nodes.add(e.cid.toString())\n yield ` node [shape=oval fontname=\"Courier\"]; ${e.cid} [label=\"${renderNodeLabel(e)}\"];`\n yield ` head -> ${e.cid};`\n for (const p of e.value.parents) {\n yield ` ${e.cid} -> ${p};`\n }\n links.push(...e.value.parents)\n }\n while (links.length) {\n const link = links.shift()\n if (!link) break\n if (nodes.has(link.toString())) continue\n nodes.add(link.toString())\n const block = await events.get(link)\n yield ` node [shape=oval]; ${link} [label=\"${renderNodeLabel(block)}\" fontname=\"Courier\"];`\n for (const p of block.value.parents) {\n yield ` ${link} -> ${p};`\n }\n links.push(...block.value.parents)\n }\n yield '}'\n}\n\nexport async function findEventsToSync (blocks, head) {\n // const callTag = Math.random().toString(36).substring(7)\n const events = new EventFetcher(blocks)\n // console.time(callTag + '.findCommonAncestorWithSortedEvents')\n const { ancestor, sorted } = await findCommonAncestorWithSortedEvents(events, head)\n // console.timeEnd(callTag + '.findCommonAncestorWithSortedEvents')\n // console.log('sorted', sorted.length)\n // console.time(callTag + '.contains')\n const toSync = await asyncFilter(sorted, async (uks) => !(await contains(events, ancestor, uks.cid)))\n // console.timeEnd(callTag + '.contains')\n\n return { cids: events.all(), events: toSync }\n}\n\nconst asyncFilter = async (arr, predicate) =>\n Promise.all(arr.map(predicate)).then((results) => arr.filter((_v, index) => results[index]))\n\nexport async function findCommonAncestorWithSortedEvents (events, children) {\n // const callTag = Math.random().toString(36).substring(7)\n // console.time(callTag + '.findCommonAncestor')\n const ancestor = await findCommonAncestor(events, children)\n // console.timeEnd(callTag + '.findCommonAncestor')\n if (!ancestor) {\n throw new Error('failed to find common ancestor event')\n }\n // console.time(callTag + '.findSortedEvents')\n const sorted = await findSortedEvents(events, children, ancestor)\n // console.timeEnd(callTag + '.findSortedEvents')\n return { ancestor, sorted }\n}\n\n/**\n * Find the common ancestor event of the passed children. A common ancestor is\n * the first single event in the DAG that _all_ paths from children lead to.\n *\n * @param {import('./clock').EventFetcher} events\n * @param {import('./clock').EventLink<EventData>[]} children\n */\nasync function findCommonAncestor (events, children) {\n if (!children.length) return\n const candidates = children.map((c) => [c])\n while (true) {\n let changed = false\n for (const c of candidates) {\n const candidate = await findAncestorCandidate(events, c[c.length - 1])\n if (!candidate) continue\n changed = true\n c.push(candidate)\n const ancestor = findCommonString(candidates)\n if (ancestor) return ancestor\n }\n if (!changed) return\n }\n}\n\n/**\n * @param {import('./clock').EventFetcher} events\n * @param {import('./clock').EventLink<EventData>} root\n */\nasync function findAncestorCandidate (events, root) {\n const { value: event } = await events.get(root)\n if (!event.parents.length) return root\n return event.parents.length === 1 ? event.parents[0] : findCommonAncestor(events, event.parents)\n}\n\n/**\n * @template {{ toString: () => string }} T\n * @param {Array<T[]>} arrays\n */\nfunction findCommonString (arrays) {\n arrays = arrays.map((a) => [...a])\n for (const arr of arrays) {\n for (const item of arr) {\n let matched = true\n for (const other of arrays) {\n if (arr === other) continue\n matched = other.some((i) => String(i) === String(item))\n if (!matched) break\n }\n if (matched) return item\n }\n }\n}\n\n/**\n * Find and sort events between the head(s) and the tail.\n * @param {import('./clock').EventFetcher} events\n * @param {import('./clock').EventLink<EventData>[]} head\n * @param {import('./clock').EventLink<EventData>} tail\n */\nasync function findSortedEvents (events, head, tail) {\n // const callTag = Math.random().toString(36).substring(7)\n // get weighted events - heavier events happened first\n /** @type {Map<string, { event: import('./clock').EventBlockView<EventData>, weight: number }>} */\n const weights = new Map()\n const all = await Promise.all(head.map((h) => findEvents(events, h, tail)))\n for (const arr of all) {\n for (const { event, depth } of arr) {\n // console.log('event value', event.value.data.value)\n const info = weights.get(event.cid.toString())\n if (info) {\n info.weight += depth\n } else {\n weights.set(event.cid.toString(), { event, weight: depth })\n }\n }\n }\n\n // group events into buckets by weight\n /** @type {Map<number, import('./clock').EventBlockView<EventData>[]>} */\n const buckets = new Map()\n for (const { event, weight } of weights.values()) {\n const bucket = buckets.get(weight)\n if (bucket) {\n bucket.push(event)\n } else {\n buckets.set(weight, [event])\n }\n }\n\n // sort by weight, and by CID within weight\n const sorted = Array.from(buckets)\n .sort((a, b) => b[0] - a[0])\n .flatMap(([, es]) => es.sort((a, b) => (String(a.cid) < String(b.cid) ? -1 : 1)))\n // console.log('sorted', sorted.map(s => s.value.data.value))\n\n return sorted\n}\n\n/**\n * @param {EventFetcher} events\n * @param {EventLink<EventData>} start\n * @param {EventLink<EventData>} end\n * @returns {Promise<Array<{ event: EventBlockView<EventData>, depth: number }>>}\n */\nasync function findEvents (events, start, end, depth = 0) {\n // console.log('findEvents', start)\n const event = await events.get(start)\n const acc = [{ event, depth }]\n const { parents } = event.value\n if (parents.length === 1 && String(parents[0]) === String(end)) return acc\n const rest = await Promise.all(parents.map((p) => findEvents(events, p, end, depth + 1)))\n return acc.concat(...rest)\n}\n","// @ts-nocheck\nimport * as codec from 'encrypted-block'\nimport {\n create,\n load\n} from 'prolly-trees/cid-set'\nimport { CID } from 'multiformats'\nimport { encode, decode, create as mfCreate } from 'multiformats/block'\nimport * as dagcbor from '@ipld/dag-cbor'\nimport { sha256 as hasher } from 'multiformats/hashes/sha2'\n\nconst createBlock = (bytes, cid) => mfCreate({ cid, bytes, hasher, codec })\n\nconst encrypt = async function * ({ get, cids, hasher, key, cache, chunker, root }) {\n const set = new Set()\n let eroot\n for (const string of cids) {\n const cid = CID.parse(string)\n const unencrypted = await get(cid)\n const block = await encode({ ...await codec.encrypt({ ...unencrypted, key }), codec, hasher })\n // console.log(`encrypting ${string} as ${block.cid}`)\n yield block\n set.add(block.cid.toString())\n if (unencrypted.cid.equals(root)) eroot = block.cid\n }\n if (!eroot) throw new Error('cids does not include root')\n const list = [...set].map(s => CID.parse(s))\n let last\n for await (const node of create({ list, get, cache, chunker, hasher, codec: dagcbor })) {\n const block = await node.block\n yield block\n last = block\n }\n const head = [eroot, last.cid]\n const block = await encode({ value: head, codec: dagcbor, hasher })\n yield block\n}\n\nconst decrypt = async function * ({ root, get, key, cache, chunker, hasher }) {\n const o = { ...await get(root), codec: dagcbor, hasher }\n const decodedRoot = await decode(o)\n // console.log('decodedRoot', decodedRoot)\n const { value: [eroot, tree] } = decodedRoot\n const rootBlock = await get(eroot) // should I decrypt?\n const cidset = await load({ cid: tree, get, cache, chunker, codec, hasher })\n const { result: nodes } = await cidset.getAllEntries()\n const unwrap = async (eblock) => {\n const { bytes, cid } = await codec.decrypt({ ...eblock, key }).catch(e => {\n console.log('ekey', e)\n throw new Error('bad key: ' + key.toString('hex'))\n })\n const block = await createBlock(bytes, cid)\n return block\n }\n const promises = []\n for (const { cid } of nodes) {\n if (!rootBlock.cid.equals(cid)) promises.push(get(cid).then(unwrap))\n }\n yield * promises\n yield unwrap(rootBlock)\n}\n\nexport {\n encrypt,\n decrypt\n}\n","// @ts-nocheck\n// from https://github.com/duzun/sync-sha1/blob/master/rawSha1.js\n// MIT License Copyright (c) 2020 Dumitru Uzun\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// import {\n// isLittleEndian, switchEndianness32\n// } from 'string-encode'\n\n/**\n* SHA1 on binary array\n*\n* @param {Uint8Array} b Data to hash\n*\n* @return {Uint8Array} sha1 hash\n*/\nexport function rawSha1 (b) {\n let i = b.byteLength\n let bs = 0\n let A; let B; let C; let D; let G\n const H = Uint32Array.from([A = 0x67452301, B = 0xEFCDAB89, ~A, ~B, 0xC3D2E1F0])\n const W = new Uint32Array(80)\n const nrWords = (i / 4 + 2) | 15\n const words = new Uint32Array(nrWords + 1)\n let j\n\n words[nrWords] = i * 8\n words[i >> 2] |= 0x80 << (~i << 3)\n for (;i--;) {\n words[i >> 2] |= b[i] << (~i << 3)\n }\n\n for (A = H.slice(); bs < nrWords; bs += 16, A.set(H)) {\n for (i = 0; i < 80;\n A[0] = (\n G = ((b = A[0]) << 5 | b >>> 27) +\n A[4] +\n (W[i] = (i < 16) ? words[bs + i] : G << 1 | G >>> 31) +\n 0x5A827999,\n B = A[1],\n C = A[2],\n D = A[3],\n G + ((j = i / 5 >> 2) // eslint-disable-line no-cond-assign\n ? j !== 2\n ? (B ^ C ^ D) + (j & 2 ? 0x6FE0483D : 0x14577208)\n : (B & C | B & D | C & D) + 0x34994343\n : B & C | ~B & D\n )\n )\n , A[1] = b\n , A[2] = B << 30 | B >>> 2\n , A[3] = C\n , A[4] = D\n , ++i\n ) {\n G = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]\n }\n\n for (i = 5; i;) H[--i] = H[i] + A[i]\n }\n\n // if (isLittleEndian()) {\n // H = H.map(switchEndianness32)\n // }\n\n return new Uint8Array(H.buffer, H.byteOffset, H.byteLength)\n}\n","import { CarReader } from '@ipld/car'\nimport { CID } from 'multiformats/cid'\nimport { sha256 } from 'multiformats/hashes/sha2'\nimport * as CBW from '@ipld/car/buffer-writer'\nimport * as raw from 'multiformats/codecs/raw'\nimport * as Block from 'multiformats/block'\nimport * as dagcbor from '@ipld/dag-cbor'\nimport { openDB } from 'idb'\nimport cargoQueue from 'async/cargoQueue.js'\n// @ts-ignore\nimport { bf } from 'prolly-trees/utils'\n// @ts-ignore\nimport { nocache as cache } from 'prolly-trees/cache'\nimport { encrypt, decrypt } from './crypto.js'\nimport { Buffer } from 'buffer'\n// @ts-ignore\nimport * as codec from 'encrypted-block'\nimport { rawSha1 as sha1sync } from './sha1.js'\nconst chunker = bf(3)\n\nconst NO_ENCRYPT = process.env?.NO_ENCRYPT\n// typeof process !== 'undefined' ? process.env.NO_ENCRYPT : import.meta && import.meta.env.VITE_NO_ENCRYPT\n\nexport class Valet {\n idb = null\n name = null\n uploadQueue = null\n alreadyEnqueued = new Set()\n keyMaterial = null\n keyId = 'null'\n\n /**\n * Function installed by the database to upload car files\n * @type {null|function(string, Uint8Array):Promise<void>}\n */\n uploadFunction = null\n\n constructor (name = 'default', keyMaterial) {\n this.name = name\n this.setKeyMaterial(keyMaterial)\n this.uploadQueue = cargoQueue(async (tasks, callback) => {\n console.log(\n 'queue worker',\n tasks.length,\n tasks.reduce((acc, t) => acc + t.value.length, 0)\n )\n if (this.uploadFunction) {\n // todo we can coalesce these into a single car file\n return await this.withDB(async db => {\n for (const task of tasks) {\n await this.uploadFunction(task.carCid, task.value)\n // update the indexedb to mark this car as no longer pending\n const carMeta = await db.get('cidToCar', task.carCid)\n delete carMeta.pending\n await db.put('cidToCar', carMeta)\n }\n })\n }\n callback()\n })\n\n this.uploadQueue.drain(async () => {\n return await this.withDB(async db => {\n const carKeys = (await db.getAllFromIndex('cidToCar', 'pending')).map(c => c.car)\n for (const carKey of carKeys) {\n await this.uploadFunction(carKey, await db.get('cars', carKey))\n const carMeta = await db.get('cidToCar', carKey)\n delete carMeta.pending\n await db.put('cidToCar', carMeta)\n }\n })\n })\n }\n\n getKeyMaterial () {\n return this.keyMaterial\n }\n\n setKeyMaterial (km) {\n if (km && !NO_ENCRYPT) {\n const hex = Uint8Array.from(Buffer.from(km, 'hex'))\n this.keyMaterial = km\n const hash = sha1sync(hex)\n this.keyId = Buffer.from(hash).toString('hex')\n } else {\n this.keyMaterial = null\n this.keyId = 'null'\n }\n // console.trace('keyId', this.name, this.keyId)\n }\n\n /**\n * Group the blocks into a car and write it to the valet.\n * @param {import('./blockstore.js').InnerBlockstore} innerBlockstore\n * @param {Set<string>} cids\n * @returns {Promise<void>}\n * @memberof Valet\n */\n async writeTransaction (innerBlockstore, cids) {\n if (innerBlockstore.lastCid) {\n if (this.keyMaterial) {\n // console.log('encrypting car', innerBlockstore.label)\n const newCar = await blocksToEncryptedCarBlock(innerBlockstore.lastCid, innerBlockstore, this.keyMaterial)\n await this.parkCar(newCar.cid.toString(), newCar.bytes, cids)\n } else {\n const newCar = await blocksToCarBlock(innerBlockstore.lastCid, innerBlockstore)\n await this.parkCar(newCar.cid.toString(), newCar.bytes, cids)\n }\n }\n }\n\n withDB = async dbWorkFun => {\n if (!this.idb) {\n this.idb = await openDB(`fp.${this.keyId}.${this.name}.valet`, 2, {\n upgrade (db, oldVersion, newVersion, transaction) {\n if (oldVersion < 1) {\n db.createObjectStore('cars') // todo use database name\n const cidToCar = db.createObjectStore('cidToCar', { keyPath: 'car' })\n cidToCar.createIndex('cids', 'cids', { multiEntry: true })\n }\n if (oldVersion < 2) {\n const cidToCar = transaction.objectStore('cidToCar')\n cidToCar.createIndex('pending', 'pending')\n }\n }\n })\n }\n return await dbWorkFun(this.idb)\n }\n\n /**\n *\n * @param {string} carCid\n * @param {*} value\n */\n async parkCar (carCid, value, cids) {\n await this.withDB(async db => {\n const tx = db.transaction(['cars', 'cidToCar'], 'readwrite')\n await tx.objectStore('cars').put(value, carCid)\n await tx.objectStore('cidToCar').put({ pending: 'y', car: carCid, cids: Array.from(cids) })\n return await tx.done\n })\n\n // upload to web3.storage if we have credentials\n if (this.uploadFunction) {\n if (this.alreadyEnqueued.has(carCid)) {\n // console.log('already enqueued', carCid)\n return\n }\n // don't await this, it will be done in the queue\n // console.log('add to queue', carCid, value.length)\n this.uploadQueue.push({ carCid, value })\n this.alreadyEnqueued.add(carCid)\n } else {\n // console.log('no upload function', carCid, value.length, this.uploadFunction)\n }\n }\n\n remoteBlockFunction = null\n\n async getBlock (dataCID) {\n return await this.withDB(async db => {\n const tx = db.transaction(['cars', 'cidToCar'], 'readonly')\n const indexResp = await tx.objectStore('cidToCar').index('cids').get(dataCID)\n const carCid = indexResp?.car\n if (!carCid) {\n throw new Error('Missing block: ' + dataCID)\n }\n const carBytes = await tx.objectStore('cars').get(carCid)\n const reader = await CarReader.fromBytes(carBytes)\n if (this.keyMaterial) {\n const roots = await reader.getRoots()\n const readerGetWithCodec = async cid => {\n const got = await reader.get(cid)\n // console.log('got.', cid.toString())\n let useCodec = codec\n if (cid.toString().indexOf('bafy') === 0) {\n useCodec = dagcbor\n }\n const decoded = await Block.decode({\n ...got,\n codec: useCodec,\n hasher: sha256\n })\n // console.log('decoded', decoded.value)\n return decoded\n }\n const { blocks } = await blocksFromEncryptedCarBlock(roots[0], readerGetWithCodec, this.keyMaterial)\n const block = blocks.find(b => b.cid.toString() === dataCID)\n if (block) {\n return block.bytes\n }\n } else {\n const gotBlock = await reader.get(CID.parse(dataCID))\n if (gotBlock) {\n return gotBlock.bytes\n }\n }\n })\n }\n}\n\nconst blocksToCarBlock = async (lastCid, blocks) => {\n let size = 0\n const headerSize = CBW.headerLength({ roots: [lastCid] })\n size += headerSize\n if (!Array.isArray(blocks)) {\n blocks = Array.from(blocks.entries())\n }\n for (const { cid, bytes } of blocks) {\n size += CBW.blockLength({ cid, bytes })\n }\n const buffer = new Uint8Array(size)\n const writer = await CBW.createWriter(buffer, { headerSize })\n\n writer.addRoot(lastCid)\n\n for (const { cid, bytes } of blocks) {\n writer.write({ cid, bytes })\n }\n await writer.close()\n return await Block.encode({ value: writer.bytes, hasher: sha256, codec: raw })\n}\n\nconst blocksToEncryptedCarBlock = async (innerBlockStoreClockRootCid, blocks, keyMaterial) => {\n const encryptionKey = Buffer.from(keyMaterial, 'hex')\n const encryptedBlocks = []\n const theCids = []\n for (const { cid } of blocks.entries()) {\n theCids.push(cid.toString())\n }\n\n let last\n for await (const block of encrypt({\n cids: theCids,\n get: async cid => blocks.get(cid), // maybe we can just use blocks.get\n key: encryptionKey,\n hasher: sha256,\n chunker,\n cache,\n // codec: dagcbor, // should be crypto?\n root: innerBlockStoreClockRootCid\n })) {\n encryptedBlocks.push(block)\n last = block\n }\n // console.log('last', last.cid.toString(), 'for clock', innerBlockStoreClockRootCid.toString())\n const encryptedCar = await blocksToCarBlock(last.cid, encryptedBlocks)\n return encryptedCar\n}\n// { root, get, key, cache, chunker, hasher }\n\nconst memoizeDecryptedCarBlocks = new Map()\nconst blocksFromEncryptedCarBlock = async (cid, get, keyMaterial) => {\n if (memoizeDecryptedCarBlocks.has(cid.toString())) {\n return memoizeDecryptedCarBlocks.get(cid.toString())\n } else {\n const blocksPromise = (async () => {\n const decryptionKey = Buffer.from(keyMaterial, 'hex')\n // console.log('decrypting', keyMaterial, cid.toString())\n const cids = new Set()\n const decryptedBlocks = []\n for await (const block of decrypt({\n root: cid,\n get,\n key: decryptionKey,\n chunker,\n hasher: sha256,\n cache\n // codec: dagcbor\n })) {\n decryptedBlocks.push(block)\n cids.add(block.cid.toString())\n }\n return { blocks: decryptedBlocks, cids }\n })()\n memoizeDecryptedCarBlocks.set(cid.toString(), blocksPromise)\n return blocksPromise\n }\n}\n","import { parse } from 'multiformats/link'\nimport { CID } from 'multiformats'\nimport { Valet } from './valet.js'\n\n// const sleep = ms => new Promise(r => setTimeout(r, ms))\n\nconst husherMap = new Map()\nconst husher = (id, workFn) => {\n if (!husherMap.has(id)) {\n husherMap.set(\n id,\n workFn().finally(() => setTimeout(() => husherMap.delete(id), 100))\n )\n }\n return husherMap.get(id)\n}\n\n/**\n * @typedef {{ get: (link: import('../src/link').AnyLink) => Promise<AnyBlock | undefined> }} BlockFetcher\n */\n\n/**\n * @typedef {Object} AnyBlock\n * @property {import('./link').AnyLink} cid - The CID of the block\n * @property {Uint8Array} bytes - The block's data\n *\n * @typedef {Object} Blockstore\n * @property {function(import('./link').AnyLink): Promise<AnyBlock|undefined>} get - A function to retrieve a block by CID\n * @property {function(import('./link').AnyLink, Uint8Array): Promise<void>} put - A function to store a block's data and CID\n *\n * A blockstore that caches writes to a transaction and only persists them when committed.\n*/\nexport class TransactionBlockstore {\n /** @type {Map<string, Uint8Array>} */\n committedBlocks = new Map()\n\n valet = null\n\n instanceId = 'blkz.' + Math.random().toString(36).substring(2, 4)\n inflightTransactions = new Set()\n\n constructor (name, encryptionKey) {\n this.valet = new Valet(name, encryptionKey)\n }\n\n /**\n * Get a block from the store.\n *\n * @param {import('./link').AnyLink} cid\n * @returns {Promise<AnyBlock | undefined>}\n */\n async get (cid) {\n const key = cid.toString()\n // it is safe to read from the in-flight transactions becauase they are immutable\n const bytes = await Promise.any([this.transactionsGet(key), this.committedGet(key)]).catch(e => {\n // console.log('networkGet', cid.toString(), e)\n return this.networkGet(key)\n })\n if (!bytes) throw new Error('Missing block: ' + key)\n return { cid, bytes }\n }\n\n // this iterates over the in-flight transactions\n // and returns the first matching block it finds\n async transactionsGet (key) {\n for (const transaction of this.inflightTransactions) {\n const got = await transaction.get(key)\n if (got && got.bytes) return got.bytes\n }\n throw new Error('Missing block: ' + key)\n }\n\n async committedGet (key) {\n const old = this.committedBlocks.get(key)\n if (old) return old\n const got = await this.valet.getBlock(key)\n // console.log('committedGet: ' + key)\n this.committedBlocks.set(key, got)\n return got\n }\n\n async clearCommittedCache () {\n this.committedBlocks.clear()\n }\n\n async networkGet (key) {\n if (this.valet.remoteBlockFunction) {\n // todo why is this on valet?\n const value = await husher(key, async () => await this.valet.remoteBlockFunction(key))\n if (value) {\n // console.log('networkGot: ' + key, value.length)\n doTransaction('networkGot: ' + key, this, async innerBlockstore => {\n await innerBlockstore.put(CID.parse(key), value)\n })\n return value\n }\n } else {\n return false\n }\n }\n\n /**\n * Add a block to the store. Usually bound to a transaction by a closure.\n * It sets the lastCid property to the CID of the block that was put.\n * This is used by the transaction as the head of the car when written to the valet.\n * We don't have to worry about which transaction we are when we are here because\n * we are the transactionBlockstore.\n *\n * @param {import('./link').AnyLink} cid\n * @param {Uint8Array} bytes\n */\n put (cid, bytes) {\n throw new Error('use a transaction to put')\n }\n\n /**\n * Iterate over all blocks in the store.\n *\n * @yields {AnyBlock}\n * @returns {AsyncGenerator<AnyBlock>}\n */\n // * entries () {\n // // needs transaction blocks?\n // // for (const [str, bytes] of this.blocks) {\n // // yield { cid: parse(str), bytes }\n // // }\n // for (const [str, bytes] of this.committedBlocks) {\n // yield { cid: parse(str), bytes }\n // }\n // }\n\n /**\n * Begin a transaction. Ensures the uncommited blocks are empty at the begining.\n * Returns the blocks to read and write during the transaction.\n * @returns {InnerBlockstore}\n * @memberof TransactionBlockstore\n */\n begin (label = '') {\n const innerTransactionBlockstore = new InnerBlockstore(label, this)\n this.inflightTransactions.add(innerTransactionBlockstore)\n return innerTransactionBlockstore\n }\n\n /**\n * Commit the transaction. Writes the blocks to the store.\n * @returns {Promise<void>}\n * @memberof TransactionBlockstore\n */\n async commit (innerBlockstore) {\n await this.doCommit(innerBlockstore)\n }\n\n // first get the transaction blockstore from the map of transaction blockstores\n // then copy it to committedBlocks\n // then write the transaction blockstore to a car\n // then write the car to the valet\n // then remove the transaction blockstore from the map of transaction blockstores\n doCommit = async innerBlockstore => {\n const cids = new Set()\n for (const { cid, bytes } of innerBlockstore.entries()) {\n const stringCid = cid.toString() // unnecessary string conversion, can we fix upstream?\n if (this.committedBlocks.has(stringCid)) {\n // console.log('Duplicate block: ' + stringCid) // todo some of this can be avoided, cost is extra size on car files\n } else {\n this.committedBlocks.set(stringCid, bytes)\n cids.add(stringCid)\n }\n }\n if (cids.size > 0) {\n // console.log(innerBlockstore.label, 'committing', cids.size, 'blocks')\n await this.valet.writeTransaction(innerBlockstore, cids)\n }\n }\n\n /**\n * Retire the transaction. Clears the uncommited blocks.\n * @returns {void}\n * @memberof TransactionBlockstore\n */\n retire (innerBlockstore) {\n this.inflightTransactions.delete(innerBlockstore)\n }\n}\n\n/**\n * Runs a function on an inner blockstore, then persists the change to a car writer\n * or other outer blockstore.\n * @param {string} label\n * @param {TransactionBlockstore} blockstore\n * @param {(innerBlockstore: Blockstore) => Promise<any>} doFun\n * @returns {Promise<any>}\n * @memberof TransactionBlockstore\n */\nexport const doTransaction = async (label, blockstore, doFun) => {\n // @ts-ignore\n if (!blockstore.commit) return await doFun(blockstore)\n // @ts-ignore\n const innerBlockstore = blockstore.begin(label)\n try {\n const result = await doFun(innerBlockstore)\n // @ts-ignore\n await blockstore.commit(innerBlockstore)\n return result\n } catch (e) {\n console.error(`Transaction ${label} failed`, e, e.stack)\n throw e\n } finally {\n // @ts-ignore\n blockstore.retire(innerBlockstore)\n }\n}\n\nexport class InnerBlockstore {\n /** @type {Map<string, Uint8Array>} */\n blocks = new Map()\n lastCid = null\n label = ''\n parentBlockstore = null\n\n constructor (label, parentBlockstore) {\n this.label = label\n this.parentBlockstore = parentBlockstore\n }\n\n /**\n * @param {import('./link').AnyLink} cid\n * @returns {Promise<AnyBlock | undefined>}\n */\n async get (cid) {\n const key = cid.toString()\n let bytes = this.blocks.get(key)\n if (bytes) {\n return { cid, bytes }\n }\n bytes = await this.parentBlockstore.committedGet(key)\n if (bytes) {\n return { cid, bytes }\n }\n }\n\n /**\n * @param {import('./link').AnyLink} cid\n * @param {Uint8Array} bytes\n */\n async put (cid, bytes) {\n // console.log('put', cid)\n this.blocks.set(cid.toString(), bytes)\n this.lastCid = cid\n }\n\n * entries () {\n for (const [str, bytes] of this.blocks) {\n yield { cid: parse(str), bytes }\n }\n }\n}\n","import {\n advance,\n EventFetcher,\n EventBlock,\n findCommonAncestorWithSortedEvents,\n findEventsToSync,\n vis as visClock\n} from './clock.js'\n// import { create, load } from '../../../../prolly-trees/src/map.js'\n// @ts-ignore\nimport { create, load } from 'prolly-trees/map'\n// @ts-ignore\nimport { nocache as cache } from 'prolly-trees/cache'\n// @ts-ignore\nimport { CIDCounter, bf, simpleCompare as compare } from 'prolly-trees/utils'\nimport * as codec from '@ipld/dag-cbor'\nimport { sha256 as hasher } from 'multiformats/hashes/sha2'\nimport { doTransaction } from './blockstore.js'\nimport { create as createBlock } from 'multiformats/block'\nconst blockOpts = { cache, chunker: bf(3), codec, hasher, compare }\n\nconst withLog = async (label, fn) => {\n const resp = await fn()\n // console.log('withLog', label, !!resp)\n return resp\n}\n\n// should also return a CIDCounter\nexport const makeGetBlock = (blocks) => {\n // const cids = new CIDCounter() // this could be used for proofs of mutations\n const getBlockFn = async (address) => {\n const { cid, bytes } = await withLog(address, () => blocks.get(address))\n // cids.add({ address: cid })\n return createBlock({ cid, bytes, hasher, codec })\n }\n return {\n // cids,\n getBlock: getBlockFn\n }\n}\n\n/**\n *\n * @param {*} param0\n * @returns\n */\nasync function createAndSaveNewEvent ({\n inBlocks,\n bigPut,\n root,\n event: inEvent,\n head,\n additions,\n removals = []\n}) {\n let cids\n const { key, value, del } = inEvent\n const data = {\n root: (root\n ? {\n cid: root.cid,\n bytes: root.bytes, // can we remove this?\n value: root.value // can we remove this?\n }\n : null),\n key\n }\n // import('./clock').EventLink<import('./clock').EventData>\n if (del) {\n data.value = null\n data.type = 'del'\n } else {\n data.value = value\n data.type = 'put'\n }\n /** @type {import('./clock').EventData} */\n // @ts-ignore\n const event = await EventBlock.create(data, head)\n bigPut(event)\n // @ts-ignore\n ;({ head, cids } = await advance(inBlocks, head, event.cid))\n\n return {\n root,\n additions,\n removals,\n head,\n clockCIDs: cids,\n event\n }\n}\n\nconst makeGetAndPutBlock = (inBlocks) => {\n // const mblocks = new MemoryBlockstore()\n // const blocks = new MultiBlockFetcher(mblocks, inBlocks)\n const { getBlock, cids } = makeGetBlock(inBlocks)\n const put = inBlocks.put.bind(inBlocks)\n const bigPut = async (block, additions) => {\n // console.log('bigPut', block.cid.toString())\n const { cid, bytes } = block\n put(cid, bytes)\n // mblocks.putSync(cid, bytes)\n if (additions) {\n additions.set(cid.toString(), block)\n }\n }\n return { getBlock, bigPut, blocks: inBlocks, cids }\n}\n\nconst bulkFromEvents = (sorted, event) => {\n if (event) {\n const update = { value: { data: { key: event.key } } }\n if (event.del) {\n update.value.data.type = 'del'\n } else {\n update.value.data.type = 'put'\n update.value.data.value = event.value\n }\n sorted.push(update)\n }\n const bulk = new Map()\n for (const { value: event } of sorted) {\n const {\n data: { type, value, key }\n } = event\n const bulkEvent = type === 'put' ? { key, value } : { key, del: true }\n bulk.set(bulkEvent.key, bulkEvent) // last wins\n }\n return Array.from(bulk.values())\n}\n\n// Get the value of the root from the ancestor event\n/**\n *\n * @param {EventFetcher} events\n * @param {import('./clock').EventLink<import('./clock').EventData>} ancestor\n * @param {*} getBlock\n * @returns\n */\nconst prollyRootFromAncestor = async (events, ancestor, getBlock) => {\n // console.log('prollyRootFromAncestor', ancestor)\n const event = await events.get(ancestor)\n const { root } = event.value.data\n // console.log('prollyRootFromAncestor', root.cid, JSON.stringify(root.value))\n if (root) {\n return load({ cid: root.cid, get: getBlock, ...blockOpts })\n } else {\n return null\n }\n}\n\nconst doProllyBulk = async (inBlocks, head, event) => {\n const { getBlock, blocks } = makeGetAndPutBlock(inBlocks)\n let bulkSorted = []\n let prollyRootNode = null\n if (head.length) {\n // Otherwise, we find the common ancestor and update the root and other blocks\n const events = new EventFetcher(blocks)\n // todo this is returning more events than necessary, lets define the desired semantics from the top down\n // good semantics mean we can cache the results of this call\n const { ancestor, sorted } = await findCommonAncestorWithSortedEvents(events, head)\n bulkSorted = sorted\n // console.log('sorted', JSON.stringify(sorted.map(({ value: { data: { key, value } } }) => ({ key, value }))))\n prollyRootNode = await prollyRootFromAncestor(events, ancestor, getBlock)\n // console.log('event', event)\n }\n\n const bulkOperations = bulkFromEvents(bulkSorted, event)\n\n // if prolly root node is null, we need to create a new one\n if (!prollyRootNode) {\n let root\n const newBlocks = []\n // if all operations are deletes, we can just return an empty root\n if (bulkOperations.every((op) => op.del)) {\n return { root: null, blocks: [] }\n }\n for await (const node of create({ get: getBlock, list: bulkOperations, ...blockOpts })) {\n root = await node.block\n newBlocks.push(root)\n }\n return { root, blocks: newBlocks }\n } else {\n return await prollyRootNode.bulk(bulkOperations) // { root: newProllyRootNode, blocks: newBlocks }\n }\n}\n\n/**\n * Put a value (a CID) for the given key. If the key exists it's value is overwritten.\n *\n * @param {import('./blockstore.js').Blockstore} inBlocks Bucket block storage.\n * @param {import('./clock').EventLink<import('./clock').EventData>[]} head Merkle clock head.\n* @param {{key: string, value: import('./clock').EventLink<import('./clock').EventData>}} event The key of the value to put.\n * @param {object} [options]\n * @returns {Promise<any>}\n */\nexport async function put (inBlocks, head, event, options) {\n const { bigPut } = makeGetAndPutBlock(inBlocks)\n\n // If the head is empty, we create a new event and return the root and addition blocks\n if (!head.length) {\n const additions = new Map()\n const { root, blocks } = await doProllyBulk(inBlocks, head, event)\n for (const b of blocks) {\n bigPut(b, additions)\n }\n return createAndSaveNewEvent({ inBlocks, bigPut, root, event, head, additions: Array.from(additions.values()) })\n }\n const { root: newProllyRootNode, blocks: newBlocks } = await doProllyBulk(inBlocks, head, event)\n\n if (!newProllyRootNode) {\n return createAndSaveNewEvent({\n inBlocks,\n bigPut,\n root: null,\n event,\n head,\n additions: []\n })\n } else {\n const prollyRootBlock = await newProllyRootNode.block\n const additions = new Map() // ; const removals = new Map()\n bigPut(prollyRootBlock, additions)\n for (const nb of newBlocks) {\n bigPut(nb, additions)\n }\n // additions are new blocks\n return createAndSaveNewEvent({\n inBlocks,\n bigPut,\n root: prollyRootBlock,\n event,\n head,\n additions: Array.from(additions.values()) /*, todo? Array.from(removals.values()) */\n })\n }\n}\n\n/**\n * Determine the effective prolly root given the current merkle clock head.\n *\n * @param {import('./blockstore.js').TransactionBlockstore} inBlocks Bucket block storage.\n * @param {import('./clock').EventLink<import('./clock').EventData>[]} head Merkle clock head.\n */\nexport async function root (inBlocks, head) {\n if (!head.length) {\n throw new Error('no head')\n }\n const { root: newProllyRootNode, blocks: newBlocks, cids } = await doProllyBulk(inBlocks, head)\n // todo maybe these should go to a temp blockstore?\n await doTransaction('root', inBlocks, async (transactionBlockstore) => {\n const { bigPut } = makeGetAndPutBlock(transactionBlockstore)\n for (const nb of newBlocks) {\n bigPut(nb)\n }\n })\n return { cids, node: newProllyRootNode }\n}\n\n/**\n * Get the list of events not known by the `since` event\n * @param {import('./blockstore.js').TransactionBlockstore} blocks Bucket block storage.\n * @param {import('./clock').EventLink<import('./clock').EventData>[]} head Merkle clock head.\n * @param {import('./clock').EventLink<import('./clock').EventData>} since Event to compare against.\n * @returns {Promise<{clockCIDs: CIDCounter, result: import('./clock').EventData[]}>}\n */\nexport async function eventsSince (blocks, head, since) {\n if (!head.length) {\n throw new Error('no head')\n }\n // @ts-ignore\n const sinceHead = [...since, ...head] // ?\n const { cids, events: unknownSorted3 } = await findEventsToSync(blocks, sinceHead)\n return { clockCIDs: cids, result: unknownSorted3.map(({ value: { data } }) => data) }\n}\n\n/**\n *\n * @param {import('./blockstore.js').TransactionBlockstore} blocks Bucket block storage.\n * @param {import('./clock').EventLink<import('./clock').EventData>[]} head Merkle clock head.\n *\n * @returns {Promise<{cids: CIDCounter, clockCIDs: CIDCounter, result: import('./clock').EventData[]}>}\n *\n */\nexport async function getAll (blocks, head) {\n // todo use the root node left around from put, etc\n // move load to a central place\n if (!head.length) {\n return { clockCIDs: new CIDCounter(), cids: new CIDCounter(), result: [] }\n }\n const { node: prollyRootNode, cids: clockCIDs } = await root(blocks, head)\n if (!prollyRootNode) {\n return { clockCIDs, cids: new CIDCounter(), result: [] }\n }\n const { result, cids } = await prollyRootNode.getAllEntries() // todo params\n return { clockCIDs, cids, result: result.map(({ key, value }) => ({ key, value })) }\n}\n\n/**\n * @param {import('./blockstore.js').TransactionBlockstore} blocks Bucket block storage.\n * @param {import('./clock').EventLink<import('./clock').EventData>[]} head Merkle clock head.\n * @param {string} key The key of the value to retrieve.\n */\nexport async function get (blocks, head, key) {\n // instead pass root from db? and always update on change\n if (!head.length) {\n return { cids: new CIDCounter(), result: null }\n }\n const { node: prollyRootNode, cids: clockCIDs } = await root(blocks, head)\n if (!prollyRootNode) {\n return { clockCIDs, cids: new CIDCounter(), result: null }\n }\n const { result, cids } = await prollyRootNode.get(key)\n return { result, cids, clockCIDs }\n}\n\nexport async function * vis (blocks, head) {\n if (!head.length) {\n return { cids: new CIDCounter(), result: null }\n }\n const { node: prollyRootNode, cids } = await root(blocks, head)\n const lines = []\n for await (const line of prollyRootNode.vis()) {\n yield line\n lines.push(line)\n }\n return { vis: lines.join('\\n'), cids }\n}\n\nexport async function visMerkleTree (blocks, head) {\n if (!head.length) {\n return { cids: new CIDCounter(), result: null }\n }\n const { node: prollyRootNode, cids } = await root(blocks, head)\n const lines = []\n for await (const line of prollyRootNode.vis()) {\n lines.push(line)\n }\n return { vis: lines.join('\\n'), cids }\n}\n\nexport async function visMerkleClock (blocks, head) {\n const lines = []\n for await (const line of visClock(blocks, head)) {\n // yield line\n lines.push(line)\n }\n return { vis: lines.join('\\n') }\n}\n","// @ts-nocheck\nimport { randomBytes } from 'crypto'\nimport { visMerkleClock, visMerkleTree, vis, put, get, getAll, eventsSince } from './prolly.js'\nimport { TransactionBlockstore, doTransaction } from './blockstore.js'\nimport charwise from 'charwise'\n\n// TypeScript Types\n// eslint-disable-next-line no-unused-vars\n// import { CID } from 'multiformats/dist/types/src/cid.js'\n// eslint-disable-next-line no-unused-vars\nclass Proof {}\n\n/**\n * @class Fireproof\n * @classdesc Fireproof stores data in IndexedDB and provides a Merkle clock.\n * This is the main class for saving and loading JSON and other documents with the database. You can find additional examples and\n * usage guides in the repository README.\n *\n * @param {import('./blockstore.js').TransactionBlockstore} blocks - The block storage instance to use documents and indexes\n * @param {CID[]} clock - The Merkle clock head to use for the Fireproof instance.\n * @param {object} [config] - Optional configuration options for the Fireproof instance.\n * @param {object} [authCtx] - Optional authorization context object to use for any authentication checks.\n *\n */\nexport class Fireproof {\n listeners = new Set()\n\n /**\n * @function storage\n * @memberof Fireproof\n * Creates a new Fireproof instance with default storage settings\n * Most apps should use this and not worry about the details.\n * @static\n * @returns {Fireproof} - a new Fireproof instance\n */\n static storage = (name = 'global') => {\n const instanceKey = randomBytes(32).toString('hex') // pass null to disable encryption\n // pick a random key from const validatedKeys\n // const instanceKey = validatedKeys[Math.floor(Math.random() * validatedKeys.length)]\n return new Fireproof(new TransactionBlockstore(name, instanceKey), [], { name })\n }\n\n constructor (blocks, clock, config, authCtx = {}) {\n this.name = config?.name || 'global'\n this.instanceId = `fp.${this.name}.${Math.random().toString(36).substring(2, 7)}`\n this.blocks = blocks\n this.clock = clock\n this.config = config\n this.authCtx = authCtx\n this.indexes = new Map()\n }\n\n /**\n * Renders the Fireproof instance as a JSON object.\n * @returns {Object} - The JSON representation of the Fireproof instance. Includes clock heads for the database and its indexes.\n * @memberof Fireproof\n * @instance\n */\n toJSON () {\n // todo this also needs to return the index roots...\n return {\n clock: this.clockToJSON(),\n name: this.name,\n key: this.blocks.valet.getKeyMaterial(),\n indexes: [...this.indexes.values()].map(index => index.toJSON())\n }\n }\n\n /**\n * Returns the Merkle clock heads for the Fireproof instance.\n * @returns {string[]} - The Merkle clock heads for the Fireproof instance.\n * @memberof Fireproof\n * @instance\n */\n clockToJSON () {\n return this.clock.map(cid => cid.toString())\n }\n\n hydrate ({ clock, name, key }) {\n this.name = name\n this.clock = clock\n this.blocks.valet.setKeyMaterial(key)\n this.indexBlocks = null\n }\n\n /**\n * Triggers a notification to all listeners\n * of the Fireproof instance so they can repaint UI, etc.\n * @returns {Promise<void>}\n * @memberof Fireproof\n * @instance\n */\n async notifyReset () {\n await this.notifyListeners({ _reset: true, _clock: this.clockToJSON() })\n }\n\n // used be indexes etc to notify database listeners of new availability\n async notifyExternal (source = 'unknown') {\n await this.notifyListeners({ _external: source, _clock: this.clockToJSON() })\n }\n\n /**\n * Returns the changes made to the Fireproof instance since the specified event.\n * @function changesSince\n * @param {CID[]} [event] - The clock head to retrieve changes since. If null or undefined, retrieves all changes.\n * @returns {Promise<{rows : Object[], clock: CID[], proof: {}}>} An object containing the rows and the head of the instance's clock.\n * @memberof Fireproof\n * @instance\n */\n async changesSince (event) {\n // console.log('changesSince', this.instanceId, event, this.clock)\n let rows, dataCIDs, clockCIDs\n // if (!event) event = []\n if (event) {\n const resp = await eventsSince(this.blocks, this.clock, event)\n const docsMap = new Map()\n for (const { key, type, value } of resp.result.map(decodeEvent)) {\n if (type === 'del') {\n docsMap.set(key, { key, del: true })\n } else {\n docsMap.set(key, { key, value })\n }\n }\n rows = Array.from(docsMap.values())\n clockCIDs = resp.clockCIDs\n // console.log('change rows', this.instanceId, rows)\n } else {\n const allResp = await getAll(this.blocks, this.clock)\n rows = allResp.result.map(({ key, value }) => (decodeEvent({ key, value })))\n dataCIDs = allResp.cids\n // console.log('dbdoc rows', this.instanceId, rows)\n }\n return {\n rows,\n clock: this.clockToJSON(),\n proof: { data: await cidsToProof(dataCIDs), clock: await cidsToProof(clockCIDs) }\n }\n }\n\n async allDocuments () {\n const allResp = await getAll(this.blocks, this.clock)\n const rows = allResp.result.map(({ key, value }) => (decodeEvent({ key, value }))).map(({ key, value }) => ({ key, value: { _id: key, ...value } }))\n return {\n rows,\n clock: this.clockToJSON(),\n proof: await cidsToProof(allResp.cids)\n }\n }\n\n /**\n * Runs validation on the specified document using the Fireproof instance's configuration. Throws an error if the document is invalid.\n *\n * @param {Object} doc - The document to validate.\n * @returns {Promise<void>}\n * @throws {Error} - Throws an error if the document is invalid.\n * @memberof Fireproof\n * @instance\n */\n async runValidation (doc) {\n if (this.config && this.config.validateChange) {\n const oldDoc = await this.get(doc._id)\n .then((doc) => doc)\n .catch(() => ({}))\n this.config.validateChange(doc, oldDoc, this.authCtx)\n }\n }\n\n /**\n * Retrieves the document with the specified ID from the database\n *\n * @param {string} key - the ID of the document to retrieve\n * @param {Object} [opts] - options\n * @returns {Promise<{_id: string}>} - the document with the specified ID\n * @memberof Fireproof\n * @instance\n */\n async get (key, opts = {}) {\n const clock = opts.clock || this.clock\n const resp = await get(this.blocks, clock, charwise.encode(key))\n\n // this tombstone is temporary until we can get the prolly tree to delete\n if (!resp || resp.result === null) {\n throw new Error('Not found')\n }\n const doc = resp.result\n if (opts.mvcc === true) {\n doc._clock = this.clockToJSON()\n }\n doc._proof = {\n data: await cidsToProof(resp.cids),\n clock: this.clockToJSON()\n }\n doc._id = key\n return doc\n }\n\n /**\n * Adds a new document to the database, or updates an existing document. Returns the ID of the document and the new clock head.\n *\n * @param {Object} doc - the document to be added\n * @param {string} doc._id - the document ID. If not provided, a random ID will be generated.\n * @param {CID[]} doc._clock - the document ID. If not provided, a random ID will be generated.\n * @param {Proof} doc._proof - CIDs referenced by the update\n * @returns {Promise<{ id: string, clock: CID[] }>} - The result of adding the document to the database\n * @memberof Fireproof\n * @instance\n */\n async put ({ _id, _proof, ...doc }) {\n const id = _id || 'f' + Math.random().toString(36).slice(2)\n await this.runValidation({ _id: id, ...doc })\n return await this.putToProllyTree({ key: id, value: doc }, doc._clock)\n }\n\n /**\n * Deletes a document from the database\n * @param {string | any} docOrId - the document ID\n * @returns {Promise<{ id: string, clock: CID[] }>} - The result of deleting the document from the database\n * @memberof Fireproof\n * @instance\n */\n async del (docOrId) {\n let id\n let clock = null\n if (docOrId._id) {\n id = docOrId._id\n clock = docOrId._clock\n } else {\n id = docOrId\n }\n await this.runValidation({ _id: id, _deleted: true })\n return await this.putToProllyTree({ key: id, del: true }, clock) // not working at prolly tree layer?\n // this tombstone is temporary until we can get the prolly tree to delete\n // return await this.putToProllyTree({ key: id, value: null }, clock)\n }\n\n /**\n * Updates the underlying storage with the specified event.\n * @private\n * @param {{del?: true, key : string, value?: any}} decodedEvent - the event to add\n * @returns {Promise<{ proof:{}, id: string, clock: CID[] }>} - The result of adding the event to storage\n */\n async putToProllyTree (decodedEvent, clock = null) {\n const event = encodeEvent(decodedEvent)\n if (clock && JSON.stringify(clock) !== JSON.stringify(this.clockToJSON())) {\n // we need to check and see what version of the document exists at the clock specified\n // if it is the same as the one we are trying to put, then we can proceed\n const resp = await eventsSince(this.blocks, this.clock, event.value._clock)\n const missedChange = resp.result.find(({ key }) => key === event.key)\n if (missedChange) {\n throw new Error('MVCC conflict, document is changed, please reload the document and try again.')\n }\n }\n const result = await doTransaction(\n 'putToProllyTree',\n this.blocks,\n async (blocks) => await put(blocks, this.clock, event)\n )\n if (!result) {\n console.error('failed', event)\n throw new Error('failed to put at storage layer')\n }\n // console.log('new clock head', this.instanceId, result.head.toString())\n this.clock = result.head // do we want to do this as a finally block\n await this.notifyListeners([decodedEvent]) // this type is odd\n return {\n id: decodedEvent.key,\n clock: this.clockToJSON(),\n proof: { data: await cidsToProof(result.cids), clock: await cidsToProof(result.clockCIDs) }\n }\n // todo should include additions (or split clock)\n }\n\n // /**\n // * Advances the clock to the specified event and updates the root CID\n // * Will be used by replication\n // */\n // async advance (event) {\n // this.clock = await advance(this.blocks, this.clock, event)\n // this.rootCid = await root(this.blocks, this.clock)\n // return this.clock\n // }\n\n async * vis () {\n return yield * vis(this.blocks, this.clock)\n }\n\n async visTree () {\n return await visMerkleTree(this.blocks, this.clock)\n }\n\n async visClock () {\n return await visMerkleClock(this.blocks, this.clock)\n }\n\n /**\n * Registers a Listener to be called when the Fireproof instance's clock is updated.\n * Recieves live changes from the database after they are committed.\n * @param {Function} listener - The listener to be called when the clock is updated.\n * @returns {Function} - A function that can be called to unregister the listener.\n * @memberof Fireproof\n */\n registerListener (listener) {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n async notifyListeners (changes) {\n // await sleep(10)\n for (const listener of this.listeners) {\n await listener(changes)\n }\n }\n\n setCarUploader (carUploaderFn) {\n // console.log('registering car uploader')\n // https://en.wikipedia.org/wiki/Law_of_Demeter - this is a violation of the law of demeter\n this.blocks.valet.uploadFunction = carUploaderFn\n }\n\n setRemoteBlockReader (remoteBlockReaderFn) {\n // console.log('registering remote block reader')\n this.blocks.valet.remoteBlockFunction = remoteBlockReaderFn\n }\n}\n\nexport async function cidsToProof (cids) {\n if (!cids || !cids.all) return []\n const all = await cids.all()\n return [...all].map((cid) => cid.toString())\n}\n\nfunction decodeEvent (event) {\n const decodedKey = charwise.decode(event.key)\n return { ...event, key: decodedKey }\n}\n\nfunction encodeEvent (event) {\n if (!(event && event.key)) return\n const encodedKey = charwise.encode(event.key)\n return { ...event, key: encodedKey }\n}\n","// @ts-ignore\nimport { create, load } from 'prolly-trees/db-index'\n// import { create, load } from '../../../../prolly-trees/src/db-index.js'\n\nimport { sha256 as hasher } from 'multiformats/hashes/sha2'\n// @ts-ignore\nimport { nocache as cache } from 'prolly-trees/cache'\n// @ts-ignore\nimport { bf, simpleCompare } from 'prolly-trees/utils'\nimport { makeGetBlock } from './prolly.js'\n// eslint-disable-next-line no-unused-vars\nimport { Fireproof, cidsToProof } from './fireproof.js'\n\nimport * as codec from '@ipld/dag-cbor'\n// import { create as createBlock } from 'multiformats/block'\nimport { TransactionBlockstore, doTransaction } from './blockstore.js'\n// @ts-ignore\nimport charwise from 'charwise'\n\nconst ALWAYS_REBUILD = false // todo: make false\n\nconst compare = (a, b) => {\n const [aKey, aRef] = a\n const [bKey, bRef] = b\n const comp = simpleCompare(aKey, bKey)\n if (comp !== 0) return comp\n return refCompare(aRef, bRef)\n}\n\nconst refCompare = (aRef, bRef) => {\n if (Number.isNaN(aRef)) return -1\n if (Number.isNaN(bRef)) throw new Error('ref may not be Infinity or NaN')\n if (aRef === Infinity) return 1 // need to test this on equal docids!\n // if (!Number.isFinite(bRef)) throw new Error('ref may not be Infinity or NaN')\n return simpleCompare(aRef, bRef)\n}\n\nconst dbIndexOpts = { cache, chunker: bf(3), codec, hasher, compare }\nconst idIndexOpts = { cache, chunker: bf(3), codec, hasher, compare: simpleCompare }\n\nconst makeDoc = ({ key, value }) => ({ _id: key, ...value })\n\n/**\n * JDoc for the result row type.\n * @typedef {Object} ChangeEvent\n * @property {string} key - The key of the document.\n * @property {Object} value - The new value of the document.\n * @property {boolean} [del] - Is the row deleted?\n * @memberof DbIndex\n */\n\n/**\n * JDoc for the result row type.\n * @typedef {Object} DbIndexEntry\n * @property {string[]} key - The key for the DbIndex entry.\n * @property {Object} value - The value of the document.\n * @property {boolean} [del] - Is the row deleted?\n * @memberof DbIndex\n */\n\n/**\n * Transforms a set of changes to DbIndex entries using a map function.\n *\n * @param {ChangeEvent[]} changes\n * @param {Function} mapFn\n * @returns {DbIndexEntry[]} The DbIndex entries generated by the map function.\n * @private\n * @memberof DbIndex\n */\nconst indexEntriesForChanges = (changes, mapFn) => {\n const indexEntries = []\n changes.forEach(({ key, value, del }) => {\n if (del || !value) return\n mapFn(makeDoc({ key, value }), (k, v) => {\n if (typeof v === 'undefined' || typeof k === 'undefined') return\n indexEntries.push({\n key: [charwise.encode(k), key],\n value: v\n })\n })\n })\n return indexEntries\n}\n\n/**\n * Represents an DbIndex for a Fireproof database.\n *\n * @class DbIndex\n * @classdesc An DbIndex can be used to order and filter the documents in a Fireproof database.\n *\n * @param {Fireproof} database - The Fireproof database instance to DbIndex.\n * @param {Function} mapFn - The map function to apply to each entry in the database.\n *\n */\nexport class DbIndex {\n constructor (database, mapFn, clock, opts = {}) {\n this.database = database\n if (!database.indexBlocks) {\n database.indexBlocks = new TransactionBlockstore(database.name + '.indexes', database.blocks.valet.getKeyMaterial())\n }\n /**\n * The map function to apply to each entry in the database.\n * @type {Function}\n */\n\n if (typeof mapFn === 'string') {\n this.mapFnString = mapFn\n } else {\n this.mapFn = mapFn\n this.mapFnString = mapFn.toString()\n }\n this.name = opts.name || this.makeName()\n this.indexById = { root: null, cid: null }\n this.indexByKey = { root: null, cid: null }\n this.dbHead = null\n if (clock) {\n this.indexById.cid = clock.byId\n this.indexByKey.cid = clock.byKey\n this.dbHead = clock.db\n }\n this.instanceId = this.database.instanceId + `.DbIndex.${Math.random().toString(36).substring(2, 7)}`\n this.updateIndexPromise = null\n if (!opts.temporary) { DbIndex.registerWithDatabase(this, this.database) }\n }\n\n makeName () {\n const regex = /\\(([^,()]+,\\s*[^,()]+|\\[[^\\]]+\\],\\s*[^,()]+)\\)/g\n const matches = Array.from(this.mapFnString.matchAll(regex), match => match[1].trim())\n return matches[1]\n }\n\n static registerWithDatabase (inIndex, database) {\n if (!database.indexes.has(inIndex.mapFnString)) {\n database.indexes.set(inIndex.mapFnString, inIndex)\n } else {\n // merge our inIndex code with the inIndex clock or vice versa\n const existingIndex = database.indexes.get(inIndex.mapFnString)\n // keep the code instance, discard the clock instance\n if (existingIndex.mapFn) { // this one also has other config\n existingIndex.dbHead = inIndex.dbHead\n existingIndex.indexById.cid = inIndex.indexById.cid\n existingIndex.indexByKey.cid = inIndex.indexByKey.cid\n } else {\n inIndex.dbHead = existingIndex.dbHead\n inIndex.indexById.cid = existingIndex.indexById.cid\n inIndex.indexByKey.cid = existingIndex.indexByKey.cid\n database.indexes.set(inIndex.mapFnString, inIndex)\n }\n }\n }\n\n toJSON () {\n const indexJson = { name: this.name, code: this.mapFnString, clock: { db: null, byId: null, byKey: null } }\n indexJson.clock.db = this.dbHead?.map(cid => cid.toString())\n indexJson.clock.byId = this.indexById.cid?.toString()\n indexJson.clock.byKey = this.indexByKey.cid?.toString()\n return indexJson\n }\n\n static fromJSON (database, { code, clock, name }) {\n // console.log('DbIndex.fromJSON', database.constructor.name, code, clock)\n return new DbIndex(database, code, clock, { name })\n }\n\n /**\n * JSDoc for Query type.\n * @typedef {Object} DbQuery\n * @property {string[]} [range] - The range to query.\n * @memberof DbIndex\n */\n\n /**\n * Query object can have {range}\n * @param {DbQuery} query - the query range to use\n * @returns {Promise<{proof: {}, rows: Array<{id: string, key: string, value: any}>}>}\n * @memberof DbIndex\n * @instance\n */\n async query (query, update = true) {\n // const callId = Math.random().toString(36).substring(2, 7)\n // todo pass a root to query a snapshot\n // console.time(callId + '.updateIndex')\n update && await this.updateIndex(this.database.indexBlocks)\n // console.timeEnd(callId + '.updateIndex')\n // console.time(callId + '.doIndexQuery')\n // console.log('query', query)\n const response = await doIndexQuery(this.database.indexBlocks, this.indexByKey, query)\n // console.timeEnd(callId + '.doIndexQuery')\n return {\n proof: { index: await cidsToProof(response.cids) },\n rows: response.result.map(({ id, key, row }) => {\n return ({ id, key: charwise.decode(key), value: row })\n })\n }\n }\n\n /**\n * Update the DbIndex with the latest changes\n * @private\n * @returns {Promise<void>}\n */\n\n async updateIndex (blocks) {\n // todo this could enqueue the request and give fresh ones to all second comers -- right now it gives out stale promises while working\n // what would it do in a world where all indexes provide a database snapshot to query?\n if (this.updateIndexPromise) return this.updateIndexPromise\n this.updateIndexPromise = this.innerUpdateIndex(blocks)\n this.updateIndexPromise.finally(() => { this.updateIndexPromise = null })\n return this.updateIndexPromise\n }\n\n async innerUpdateIndex (inBlocks) {\n // const callTag = Math.random().toString(36).substring(4)\n // console.log(`updateIndex ${callTag} >`, this.instanceId, this.dbHead?.toString(), this.indexByKey.cid?.toString(), this.indexById.cid?.toString())\n // todo remove this hack\n if (ALWAYS_REBUILD) {\n this.indexById = { root: null, cid: null }\n this.indexByKey = { root: null, cid: null }\n this.dbHead = null\n }\n // console.log('dbHead', this.dbHead)\n // console.time(callTag + '.changesSince')\n const result = await this.database.changesSince(this.dbHead) // {key, value, del}\n // console.timeEnd(callTag + '.changesSince')\n // console.log('result.rows.length', result.rows.length)\n\n // console.time(callTag + '.doTransactionupdateIndex')\n // console.log('updateIndex changes length', result.rows.length)\n\n if (result.rows.length === 0) {\n // console.log('updateIndex < no changes', result.clock)\n this.dbHead = result.clock\n return\n }\n await doTransaction('updateIndex', inBlocks, async (blocks) => {\n let oldIndexEntries = []\n let removeByIdIndexEntries = []\n await loadIndex(blocks, this.indexById, idIndexOpts)\n await loadIndex(blocks, this.indexByKey, dbIndexOpts)\n if (this.dbHead) {\n const oldChangeEntries = await this.indexById.root.getMany(result.rows.map(({ key }) => key))\n oldIndexEntries = oldChangeEntries.result.map((key) => ({ key, del: true }))\n removeByIdIndexEntries = oldIndexEntries.map(({ key }) => ({ key: key[1], del: true }))\n }\n if (!this.mapFn) {\n throw new Error('No live map function installed for index, cannot update. Make sure your index definition runs before any queries.' + (this.mapFnString ? ' Your code should match the stored map function source:\\n' + this.mapFnString : ''))\n }\n const indexEntries = indexEntriesForChanges(result.rows, this.mapFn)\n const byIdIndexEntries = indexEntries.map(({ key }) => ({ key: key[1], value: key }))\n this.indexById = await bulkIndex(blocks, this.indexById, removeByIdIndexEntries.concat(byIdIndexEntries), idIndexOpts)\n this.indexByKey = await bulkIndex(blocks, this.indexByKey, oldIndexEntries.concat(indexEntries), dbIndexOpts)\n this.dbHead = result.clock\n })\n this.database.notifyExternal('dbIndex')\n // console.timeEnd(callTag + '.doTransactionupdateIndex')\n // console.log(`updateIndex ${callTag} <`, this.instanceId, this.dbHead?.toString(), this.indexByKey.cid?.toString(), this.indexById.cid?.toString())\n }\n}\n\n/**\n * Update the DbIndex with the given entries\n * @param {import('./blockstore.js').Blockstore} blocks\n * @param {{root, cid}} inIndex\n * @param {DbIndexEntry[]} indexEntries\n * @private\n */\nasync function bulkIndex (blocks, inIndex, indexEntries, opts) {\n if (!indexEntries.length) return inIndex\n const putBlock = blocks.put.bind(blocks)\n const { getBlock } = makeGetBlock(blocks)\n let returnRootBlock\n let returnNode\n if (!inIndex.root) {\n const cid = inIndex.cid\n if (!cid) {\n for await (const node of await create({ get: getBlock, list: indexEntries, ...opts })) {\n const block = await node.block\n await putBlock(block.cid, block.bytes)\n returnRootBlock = block\n returnNode = node\n }\n return { root: returnNode, cid: returnRootBlock.cid }\n }\n inIndex.root = await load({ cid, get: getBlock, ...dbIndexOpts })\n }\n const { root, blocks: newBlocks } = await inIndex.root.bulk(indexEntries)\n returnRootBlock = await root.block\n returnNode = root\n for await (const block of newBlocks) {\n await putBlock(block.cid, block.bytes)\n }\n await putBlock(returnRootBlock.cid, returnRootBlock.bytes)\n return { root: returnNode, cid: returnRootBlock.cid }\n}\n\nasync function loadIndex (blocks, index, indexOpts) {\n if (!index.root) {\n const cid = index.cid\n if (!cid) return\n const { getBlock } = makeGetBlock(blocks)\n index.root = await load({ cid, get: getBlock, ...indexOpts })\n }\n return index.root\n}\n\nasync function applyLimit (results, limit) {\n results.result = results.result.slice(0, limit)\n return results\n}\n\nasync function doIndexQuery (blocks, indexByKey, query = {}) {\n await loadIndex(blocks, indexByKey, dbIndexOpts)\n if (!indexByKey.root) return { result: [] }\n if (query.range) {\n const encodedRange = query.range.map((key) => charwise.encode(key))\n return applyLimit(await indexByKey.root.range(...encodedRange), query.limit)\n } else if (query.key) {\n const encodedKey = charwise.encode(query.key)\n return indexByKey.root.get(encodedKey)\n } else {\n const { result, ...all } = await indexByKey.root.getAllEntries()\n return applyLimit({ result: result.map(({ key: [k, id], value }) => ({ key: k, id, row: value })), ...all }, query.limit)\n }\n}\n","/**\n * A Fireproof database Listener allows you to react to events in the database.\n *\n * @class Listener\n * @classdesc An listener attaches to a Fireproof database and runs a routing function on each change, sending the results to subscribers.\n *\n * @param {import('./fireproof.js').Fireproof} database - The Fireproof database instance to index.\n * @param {Function} routingFn - The routing function to apply to each entry in the database.\n */\n// import { ChangeEvent } from './db-index'\n\nexport class Listener {\n subcribers = new Map()\n doStopListening = null\n\n /**\n * @param {import('./fireproof.js').Fireproof} database\n * @param {(_: any, emit: any) => void} routingFn\n */\n constructor (database, routingFn) {\n this.database = database\n this.doStopListening = database.registerListener((/** @type {any} */ changes) => this.onChanges(changes))\n /**\n * The map function to apply to each entry in the database.\n * @type {Function}\n */\n this.routingFn =\n routingFn ||\n function (/** @type {any} */ _, /** @type {(arg0: string) => void} */ emit) {\n emit('*')\n }\n this.dbHead = null\n }\n\n /**\n * Subscribe to a topic emitted by the event function.\n * @param {string} topic - The topic to subscribe to.\n * @param {Function} subscriber - The function to call when the topic is emitted.\n * @returns {Function} A function to unsubscribe from the topic.\n * @memberof Listener\n * @instance\n * @param {any} since\n */\n on (topic, subscriber, since) {\n const listOfTopicSubscribers = getTopicList(this.subcribers, topic)\n listOfTopicSubscribers.push(subscriber)\n if (typeof since !== 'undefined') {\n this.database.changesSince(since).then(({ rows: changes }) => {\n const keys = topicsForChanges(changes, this.routingFn).get(topic)\n if (keys) keys.forEach((/** @type {any} */ key) => subscriber(key))\n })\n }\n return () => {\n const index = listOfTopicSubscribers.indexOf(subscriber)\n if (index > -1) listOfTopicSubscribers.splice(index, 1)\n }\n }\n\n /**\n * @typedef {import('./db-index').ChangeEvent} ChangeEvent\n */\n\n /**\n * @param {ChangeEvent[]} changes\n */\n onChanges (changes) {\n if (Array.isArray(changes)) {\n const seenTopics = topicsForChanges(changes, this.routingFn)\n for (const [topic, keys] of seenTopics) {\n const listOfTopicSubscribers = getTopicList(this.subcribers, topic)\n listOfTopicSubscribers.forEach((/** @type {(arg0: any) => any} */ subscriber) =>\n keys.forEach((/** @type {any} */ key) => subscriber(key))\n )\n }\n } else {\n // non-arrays go to all subscribers\n for (const [, listOfTopicSubscribers] of this.subcribers) {\n listOfTopicSubscribers.forEach((/** @type {(arg0: any) => any} */ subscriber) => subscriber(changes))\n }\n }\n }\n}\n\n/**\n * @param {Map<any, any>} subscribersMap\n * @param {string} name\n */\nfunction getTopicList (subscribersMap, name) {\n let topicList = subscribersMap.get(name)\n if (!topicList) {\n topicList = []\n subscribersMap.set(name, topicList)\n }\n return topicList\n}\n\n/**\n * Transforms a set of changes to events using an emitter function.\n *\n * @param {ChangeEvent[]} changes\n * @param {Function} routingFn\n * @returns {Map<string,string[]>} The topics emmitted by the event function.\n * @private\n */\nconst topicsForChanges = (changes, routingFn) => {\n const seenTopics = new Map()\n changes.forEach(({ key, value, del }) => {\n if (del || !value) value = { _deleted: true }\n routingFn({ _id: key, ...value }, (/** @type {any} */ t) => {\n const topicList = getTopicList(seenTopics, t)\n topicList.push(key)\n })\n })\n return seenTopics\n}\n","import { DbIndex } from './db-index.js'\nimport { Fireproof } from './fireproof.js'\nimport { CID } from 'multiformats'\n\nconst parseCID = cid => typeof cid === 'string' ? CID.parse(cid) : cid\n\nexport class Hydrator {\n static fromJSON (json, database) {\n database.hydrate({ clock: json.clock.map(c => parseCID(c)), name: json.name, key: json.key })\n if (json.indexes) {\n for (const { name, code, clock: { byId, byKey, db } } of json.indexes) {\n DbIndex.fromJSON(database, {\n clock: {\n byId: byId ? parseCID(byId) : null,\n byKey: byKey ? parseCID(byKey) : null,\n db: db ? db.map(c => parseCID(c)) : null\n },\n code,\n name\n })\n }\n }\n return database\n }\n\n static snapshot (database, clock) {\n const definition = database.toJSON()\n const withBlocks = new Fireproof(database.blocks)\n if (clock) {\n definition.clock = clock.map(c => parseCID(c))\n definition.indexes.forEach(index => {\n index.clock.byId = null\n index.clock.byKey = null\n index.clock.db = null\n })\n }\n const snappedDb = this.fromJSON(definition, withBlocks)\n ;([...database.indexes.values()]).forEach(index => {\n snappedDb.indexes.get(index.mapFnString).mapFn = index.mapFn\n })\n return snappedDb\n }\n\n static async zoom (database, clock) {\n ;([...database.indexes.values()]).forEach(index => {\n index.indexById = { root: null, cid: null }\n index.indexByKey = { root: null, cid: null }\n index.dbHead = null\n })\n database.clock = clock.map(c => parseCID(c))\n await database.notifyReset() // hmm... indexes should listen to this? might be more complex than worth it. so far this is the only caller\n return database\n }\n}\n"],"names":["Block","cbor","vis","mfCreate","hasher","block","sha1sync","CID","cache","codec","compare","createBlock","root","put","event","load","create","visClock","doc"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA4CsB,eAAA,OAAA,CAAS,MAAQ,EAAA,IAAA,EAAM,KAAO,EAAA;AAElD,EAAM,MAAA,MAAA,GAAS,IAAI,YAAA,CAAa,MAAM,CAAA,CAAA;AACtC,EAAA,MAAM,OAAU,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,GAAI,CAAA,CAAC,GAAQ,KAAA,CAAC,GAAI,CAAA,QAAA,EAAY,EAAA,GAAG,CAAC,CAAC,CAAA,CAAA;AAGhE,EAAA,IAAI,OAAQ,CAAA,GAAA,CAAI,KAAM,CAAA,QAAA,EAAU,CAAA;AAAG,IAAA,OAAO,EAAE,IAAM,EAAA,IAAA,EAAM,MAAM,MAAA,CAAO,KAAM,EAAA,CAAA;AAG3E,EAAA,IAAI,OAAU,GAAA,KAAA,CAAA;AACd,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,IAAA,IAAI,MAAM,QAAA,CAAS,MAAQ,EAAA,KAAA,EAAO,GAAG,CAAG,EAAA;AACtC,MAAQ,OAAA,CAAA,MAAA,CAAO,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAC7B,MAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,CAAM,QAAS,EAAA,EAAG,KAAK,CAAA,CAAA;AACnC,MAAU,OAAA,GAAA,IAAA,CAAA;AAAA,KACZ;AAAA,GACF;AAGA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,OAAO,EAAE,IAAA,EAAM,CAAC,GAAG,OAAQ,CAAA,MAAA,EAAQ,CAAA,EAAG,IAAM,EAAA,MAAM,MAAO,CAAA,GAAA,EAAM,EAAA,CAAA;AAAA,GACjE;AAGA,EAAA,KAAA,MAAW,KAAK,IAAM,EAAA;AACpB,IAAA,IAAI,MAAM,QAAA,CAAS,MAAQ,EAAA,CAAA,EAAG,KAAK,CAAG,EAAA;AACpC,MAAA,OAAO,EAAE,IAAM,EAAA,IAAA,EAAM,MAAM,MAAA,CAAO,KAAM,EAAA,CAAA;AAAA,KAC1C;AAAA,GACF;AAGA,EAAO,OAAA,EAAE,IAAM,EAAA,IAAA,CAAK,MAAO,CAAA,KAAK,GAAG,IAAM,EAAA,MAAM,MAAO,CAAA,GAAA,EAAM,EAAA,CAAA;AAC9D,CAAA;AAMO,MAAM,mBAAmBA,OAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpC,WAAa,CAAA,EAAE,GAAK,EAAA,KAAA,EAAO,OAAS,EAAA;AAElC,IAAA,KAAA,CAAM,EAAE,GAAA,EAAK,KAAO,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,GAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAQ,CAAA,IAAA,EAAM,OAAS,EAAA;AAC5B,IAAA,OAAO,iBAAiB,EAAE,IAAA,EAAM,SAAS,OAAW,IAAA,IAAI,CAAA,CAAA;AAAA,GAC1D;AACF,CAAA;AAGO,MAAM,YAAa,CAAA;AAAA;AAAA,EAExB,YAAa,MAAQ,EAAA;AAEnB,IAAA,IAAA,CAAK,OAAU,GAAA,MAAA,CAAA;AACf,IAAK,IAAA,CAAA,KAAA,GAAQ,IAAI,UAAW,EAAA,CAAA;AAC5B,IAAK,IAAA,CAAA,MAAA,uBAAa,GAAI,EAAA,CAAA;AAAA,GACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAK,IAAM,EAAA;AACf,IAAM,MAAA,KAAA,GAAQ,KAAK,QAAS,EAAA,CAAA;AAE5B,IAAI,IAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,KAAK,CAAA;AAAG,MAAO,OAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AACxD,IAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,IAAI,IAAI,CAAA,CAAA;AACzC,IAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,EAAE,OAAA,EAAS,MAAM,CAAA,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA;AAAO,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,eAAA,EAAkB,IAAM,CAAA,CAAA,CAAA,CAAA;AACpD,IAAM,MAAA,GAAA,GAAM,gBAAiB,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACxC,IAAK,IAAA,CAAA,MAAA,CAAO,GAAI,CAAA,KAAA,EAAO,GAAG,CAAA,CAAA;AAC1B,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAM,GAAO,GAAA;AAEX,IAAO,OAAA,IAAA,CAAK,MAAM,GAAI,EAAA,CAAA;AAAA,GACxB;AACF,CAAA;AAOA,eAAsB,iBAAkB,KAAO,EAAA;AAE7C,EAAA,MAAM,EAAE,GAAA,EAAK,KAAM,EAAA,GAAI,MAAM,MAAA,CAAO,EAAE,KAAA,EAAO,KAAO,EAAAC,OAAA,EAAM,MAAQ,EAAA,MAAA,EAAQ,CAAA,CAAA;AAE1E,EAAA,OAAO,IAAID,OAAM,CAAA,EAAE,GAAK,EAAA,KAAA,EAAO,OAAO,CAAA,CAAA;AACxC,CAAA;AAOA,eAAsB,iBAAkB,KAAO,EAAA;AAC7C,EAAA,MAAM,EAAE,GAAA,EAAK,KAAM,EAAA,GAAI,MAAM,MAAA,CAAO,EAAE,KAAA,EAAO,KAAO,EAAAC,OAAA,EAAM,MAAQ,EAAA,MAAA,EAAQ,CAAA,CAAA;AAE1E,EAAA,OAAO,IAAID,OAAM,CAAA,EAAE,GAAK,EAAA,KAAA,EAAO,OAAO,CAAA,CAAA;AACxC,CAAA;AASA,eAAe,QAAA,CAAU,MAAQ,EAAA,CAAA,EAAG,CAAG,EAAA;AACrC,EAAA,IAAI,CAAE,CAAA,QAAA,EAAe,KAAA,CAAA,CAAE,QAAS,EAAA;AAAG,IAAO,OAAA,IAAA,CAAA;AAC1C,EAAM,MAAA,CAAC,EAAE,KAAO,EAAA,MAAA,IAAU,EAAE,KAAA,EAAO,MAAO,EAAC,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA,CAAC,OAAO,GAAI,CAAA,CAAC,GAAG,MAAO,CAAA,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,CAAA;AAC/F,EAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA,CAAA;AAChC,EAAA,OAAO,MAAM,MAAQ,EAAA;AACnB,IAAM,MAAA,IAAA,GAAO,MAAM,KAAM,EAAA,CAAA;AACzB,IAAA,IAAI,CAAC,IAAA;AAAM,MAAA,MAAA;AACX,IAAA,IAAI,IAAK,CAAA,QAAA,EAAe,KAAA,CAAA,CAAE,QAAS,EAAA;AAAG,MAAO,OAAA,IAAA,CAAA;AAG7C,IAAI,IAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAA,KAAM,KAAK,QAAS,EAAA,KAAM,CAAE,CAAA,QAAA,EAAU,CAAA;AAAG,MAAA,SAAA;AAClE,IAAA,MAAM,EAAE,KAAO,EAAA,KAAA,KAAU,MAAM,MAAA,CAAO,IAAI,IAAI,CAAA,CAAA;AAC9C,IAAM,KAAA,CAAA,IAAA,CAAK,GAAG,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,GAC7B;AACA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AASA,gBAAwBE,KAAK,CAAA,MAAA,EAAQ,IAAM,EAAA,OAAA,GAAU,EAAI,EAAA;AAEvD,EAAA,MAAM,kBAAkB,OAAQ,CAAA,eAAA,KAAoB,CAAC,CAAM,KAAA,CAAA,CAAE,MAAM,IAAK,CAAA,KAAA,CAAA,CAAA;AACxE,EAAM,MAAA,MAAA,GAAS,IAAI,YAAA,CAAa,MAAM,CAAA,CAAA;AACtC,EAAM,MAAA,iBAAA,CAAA;AACN,EAAM,MAAA,gDAAA,CAAA;AACN,EAAA,MAAM,OAAU,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,MAAO,CAAA,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA,CAAA;AACtE,EAAA,MAAM,QAAQ,EAAC,CAAA;AACf,EAAM,MAAA,KAAA,uBAAY,GAAI,EAAA,CAAA;AACtB,EAAA,KAAA,MAAW,KAAK,OAAS,EAAA;AACvB,IAAA,KAAA,CAAM,GAAI,CAAA,CAAA,CAAE,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAC1B,IAAA,MAAM,CAA2C,wCAAA,EAAA,CAAA,CAAE,GAAe,CAAA,SAAA,EAAA,eAAA,CAAgB,CAAC,CAAA,CAAA,GAAA,CAAA,CAAA;AACnF,IAAA,MAAM,aAAa,CAAE,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA;AACrB,IAAW,KAAA,MAAA,CAAA,IAAK,CAAE,CAAA,KAAA,CAAM,OAAS,EAAA;AAC/B,MAAM,MAAA,CAAA,EAAA,EAAK,EAAE,GAAU,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KACzB;AACA,IAAA,KAAA,CAAM,IAAK,CAAA,GAAG,CAAE,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,GAC/B;AACA,EAAA,OAAO,MAAM,MAAQ,EAAA;AACnB,IAAM,MAAA,IAAA,GAAO,MAAM,KAAM,EAAA,CAAA;AACzB,IAAA,IAAI,CAAC,IAAA;AAAM,MAAA,MAAA;AACX,IAAA,IAAI,KAAM,CAAA,GAAA,CAAI,IAAK,CAAA,QAAA,EAAU,CAAA;AAAG,MAAA,SAAA;AAChC,IAAM,KAAA,CAAA,GAAA,CAAI,IAAK,CAAA,QAAA,EAAU,CAAA,CAAA;AACzB,IAAA,MAAM,KAAQ,GAAA,MAAM,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AACnC,IAAM,MAAA,CAAA,qBAAA,EAAwB,IAAgB,CAAA,SAAA,EAAA,eAAA,CAAgB,KAAK,CAAA,CAAA,sBAAA,CAAA,CAAA;AACnE,IAAW,KAAA,MAAA,CAAA,IAAK,KAAM,CAAA,KAAA,CAAM,OAAS,EAAA;AACnC,MAAA,MAAM,KAAK,IAAW,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KACxB;AACA,IAAA,KAAA,CAAM,IAAK,CAAA,GAAG,KAAM,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,GACnC;AACA,EAAM,MAAA,GAAA,CAAA;AACR,CAAA;AAEsB,eAAA,gBAAA,CAAkB,QAAQ,IAAM,EAAA;AAEpD,EAAM,MAAA,MAAA,GAAS,IAAI,YAAA,CAAa,MAAM,CAAA,CAAA;AAEtC,EAAA,MAAM,EAAE,QAAU,EAAA,MAAA,KAAW,MAAM,kCAAA,CAAmC,QAAQ,IAAI,CAAA,CAAA;AAIlF,EAAA,MAAM,MAAS,GAAA,MAAM,WAAY,CAAA,MAAA,EAAQ,OAAO,GAAA,KAAQ,CAAE,MAAM,QAAS,CAAA,MAAA,EAAQ,QAAU,EAAA,GAAA,CAAI,GAAG,CAAE,CAAA,CAAA;AAGpG,EAAA,OAAO,EAAE,IAAM,EAAA,MAAA,CAAO,GAAI,EAAA,EAAG,QAAQ,MAAO,EAAA,CAAA;AAC9C,CAAA;AAEA,MAAM,WAAA,GAAc,OAAO,GAAK,EAAA,SAAA,KAC9B,QAAQ,GAAI,CAAA,GAAA,CAAI,GAAI,CAAA,SAAS,CAAC,CAAA,CAAE,KAAK,CAAC,OAAA,KAAY,IAAI,MAAO,CAAA,CAAC,IAAI,KAAU,KAAA,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA,CAAA;AAEvE,eAAA,kCAAA,CAAoC,QAAQ,QAAU,EAAA;AAG1E,EAAA,MAAM,QAAW,GAAA,MAAM,kBAAmB,CAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AAE1D,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAM,MAAA,IAAI,MAAM,sCAAsC,CAAA,CAAA;AAAA,GACxD;AAEA,EAAA,MAAM,MAAS,GAAA,MAAM,gBAAiB,CAAA,MAAA,EAAQ,UAAU,QAAQ,CAAA,CAAA;AAEhE,EAAO,OAAA,EAAE,UAAU,MAAO,EAAA,CAAA;AAC5B,CAAA;AASA,eAAe,kBAAA,CAAoB,QAAQ,QAAU,EAAA;AACnD,EAAA,IAAI,CAAC,QAAS,CAAA,MAAA;AAAQ,IAAA,OAAA;AACtB,EAAA,MAAM,aAAa,QAAS,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AAC1C,EAAA,OAAO,IAAM,EAAA;AACX,IAAA,IAAI,OAAU,GAAA,KAAA,CAAA;AACd,IAAA,KAAA,MAAW,KAAK,UAAY,EAAA;AAC1B,MAAM,MAAA,SAAA,GAAY,MAAM,qBAAsB,CAAA,MAAA,EAAQ,EAAE,CAAE,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AACrE,MAAA,IAAI,CAAC,SAAA;AAAW,QAAA,SAAA;AAChB,MAAU,OAAA,GAAA,IAAA,CAAA;AACV,MAAA,CAAA,CAAE,KAAK,SAAS,CAAA,CAAA;AAChB,MAAM,MAAA,QAAA,GAAW,iBAAiB,UAAU,CAAA,CAAA;AAC5C,MAAI,IAAA,QAAA;AAAU,QAAO,OAAA,QAAA,CAAA;AAAA,KACvB;AACA,IAAA,IAAI,CAAC,OAAA;AAAS,MAAA,OAAA;AAAA,GAChB;AACF,CAAA;AAMA,eAAe,qBAAA,CAAuB,QAAQ,IAAM,EAAA;AAClD,EAAA,MAAM,EAAE,KAAO,EAAA,KAAA,KAAU,MAAM,MAAA,CAAO,IAAI,IAAI,CAAA,CAAA;AAC9C,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,MAAA;AAAQ,IAAO,OAAA,IAAA,CAAA;AAClC,EAAO,OAAA,KAAA,CAAM,OAAQ,CAAA,MAAA,KAAW,CAAI,GAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,CAAI,GAAA,kBAAA,CAAmB,MAAQ,EAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACjG,CAAA;AAMA,SAAS,iBAAkB,MAAQ,EAAA;AACjC,EAAA,MAAA,GAAS,OAAO,GAAI,CAAA,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA,CAAA;AACjC,EAAA,KAAA,MAAW,OAAO,MAAQ,EAAA;AACxB,IAAA,KAAA,MAAW,QAAQ,GAAK,EAAA;AACtB,MAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AACd,MAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,QAAA,IAAI,GAAQ,KAAA,KAAA;AAAO,UAAA,SAAA;AACnB,QAAU,OAAA,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,KAAM,MAAO,CAAA,IAAI,CAAC,CAAA,CAAA;AACtD,QAAA,IAAI,CAAC,OAAA;AAAS,UAAA,MAAA;AAAA,OAChB;AACA,MAAI,IAAA,OAAA;AAAS,QAAO,OAAA,IAAA,CAAA;AAAA,KACtB;AAAA,GACF;AACF,CAAA;AAQA,eAAe,gBAAA,CAAkB,MAAQ,EAAA,IAAA,EAAM,IAAM,EAAA;AAInD,EAAM,MAAA,OAAA,uBAAc,GAAI,EAAA,CAAA;AACxB,EAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,UAAW,CAAA,MAAA,EAAQ,CAAG,EAAA,IAAI,CAAC,CAAC,CAAA,CAAA;AAC1E,EAAA,KAAA,MAAW,OAAO,GAAK,EAAA;AACrB,IAAA,KAAA,MAAW,EAAE,KAAA,EAAO,KAAM,EAAA,IAAK,GAAK,EAAA;AAElC,MAAA,MAAM,OAAO,OAAQ,CAAA,GAAA,CAAI,KAAM,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAC7C,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,IAAA,CAAK,MAAU,IAAA,KAAA,CAAA;AAAA,OACV,MAAA;AACL,QAAQ,OAAA,CAAA,GAAA,CAAI,MAAM,GAAI,CAAA,QAAA,IAAY,EAAE,KAAA,EAAO,MAAQ,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,OAC5D;AAAA,KACF;AAAA,GACF;AAIA,EAAM,MAAA,OAAA,uBAAc,GAAI,EAAA,CAAA;AACxB,EAAA,KAAA,MAAW,EAAE,KAAO,EAAA,MAAA,EAAY,IAAA,OAAA,CAAQ,QAAU,EAAA;AAChD,IAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AACjC,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAA;AAAA,KACZ,MAAA;AACL,MAAA,OAAA,CAAQ,GAAI,CAAA,MAAA,EAAQ,CAAC,KAAK,CAAC,CAAA,CAAA;AAAA,KAC7B;AAAA,GACF;AAGA,EAAA,MAAM,SAAS,KAAM,CAAA,IAAA,CAAK,OAAO,CAAA,CAC9B,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAC,EAC1B,OAAQ,CAAA,CAAC,GAAG,EAAE,CAAM,KAAA,EAAA,CAAG,IAAK,CAAA,CAAC,GAAG,CAAO,KAAA,MAAA,CAAO,CAAE,CAAA,GAAG,IAAI,MAAO,CAAA,CAAA,CAAE,GAAG,CAAI,GAAA,CAAA,CAAA,GAAK,CAAE,CAAC,CAAA,CAAA;AAGlF,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAQA,eAAe,UAAY,CAAA,MAAA,EAAQ,KAAO,EAAA,GAAA,EAAK,QAAQ,CAAG,EAAA;AAExD,EAAA,MAAM,KAAQ,GAAA,MAAM,MAAO,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AACpC,EAAA,MAAM,GAAM,GAAA,CAAC,EAAE,KAAA,EAAO,OAAO,CAAA,CAAA;AAC7B,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,KAAM,CAAA,KAAA,CAAA;AAC1B,EAAI,IAAA,OAAA,CAAQ,WAAW,CAAK,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAM,KAAA,MAAA,CAAO,GAAG,CAAA;AAAG,IAAO,OAAA,GAAA,CAAA;AACvE,EAAA,MAAM,IAAO,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,QAAQ,GAAI,CAAA,CAAC,CAAM,KAAA,UAAA,CAAW,QAAQ,CAAG,EAAA,GAAA,EAAK,KAAQ,GAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AACxF,EAAO,OAAA,GAAA,CAAI,MAAO,CAAA,GAAG,IAAI,CAAA,CAAA;AAC3B;;ACnWA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAO,GAAQ,KAAAC,QAAA,CAAS,EAAE,GAAK,EAAA,KAAA,UAAOC,MAAQ,EAAA,KAAA,EAAO,CAAA,CAAA;AAE1E,MAAM,OAAA,GAAU,iBAAkB,EAAE,GAAK,EAAA,IAAA,EAAM,MAAAA,EAAAA,OAAAA,EAAQ,GAAK,EAAA,KAAA,EAAO,OAAS,EAAA,IAAA,EAAQ,EAAA;AAClF,EAAM,MAAA,GAAA,uBAAU,GAAI,EAAA,CAAA;AACpB,EAAI,IAAA,KAAA,CAAA;AACJ,EAAA,KAAA,MAAW,UAAU,IAAM,EAAA;AACzB,IAAM,MAAA,GAAA,GAAM,GAAI,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAC5B,IAAM,MAAA,WAAA,GAAc,MAAM,GAAA,CAAI,GAAG,CAAA,CAAA;AACjC,IAAA,MAAMC,SAAQ,MAAM,MAAA,CAAO,EAAE,GAAG,MAAM,KAAM,CAAA,OAAA,CAAQ,EAAE,GAAG,aAAa,GAAI,EAAC,GAAG,KAAO,EAAA,MAAA,EAAAD,SAAQ,CAAA,CAAA;AAE7F,IAAMC,MAAAA,MAAAA,CAAAA;AACN,IAAA,GAAA,CAAI,GAAIA,CAAAA,MAAAA,CAAM,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAC5B,IAAI,IAAA,WAAA,CAAY,GAAI,CAAA,MAAA,CAAO,IAAI,CAAA;AAAG,MAAA,KAAA,GAAQA,MAAM,CAAA,GAAA,CAAA;AAAA,GAClD;AACA,EAAA,IAAI,CAAC,KAAA;AAAO,IAAM,MAAA,IAAI,MAAM,4BAA4B,CAAA,CAAA;AACxD,EAAM,MAAA,IAAA,GAAO,CAAC,GAAG,GAAG,CAAA,CAAE,IAAI,CAAK,CAAA,KAAA,GAAA,CAAI,KAAM,CAAA,CAAC,CAAC,CAAA,CAAA;AAC3C,EAAI,IAAA,IAAA,CAAA;AACJ,EAAA,WAAA,MAAiB,IAAQ,IAAA,MAAA,CAAO,EAAE,IAAA,EAAM,GAAK,EAAA,KAAA,EAAO,OAAS,EAAA,MAAA,EAAAD,OAAQ,EAAA,KAAA,EAAO,OAAQ,EAAC,CAAG,EAAA;AACtF,IAAMC,MAAAA,MAAAA,GAAQ,MAAM,IAAK,CAAA,KAAA,CAAA;AACzB,IAAMA,MAAAA,MAAAA,CAAAA;AACN,IAAOA,IAAAA,GAAAA,MAAAA,CAAAA;AAAA,GACT;AACA,EAAA,MAAM,IAAO,GAAA,CAAC,KAAO,EAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAC7B,EAAM,MAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,EAAE,KAAA,EAAO,MAAM,KAAO,EAAA,OAAA,EAAS,MAAAD,EAAAA,OAAAA,EAAQ,CAAA,CAAA;AAClE,EAAM,MAAA,KAAA,CAAA;AACR,CAAA,CAAA;AAEA,MAAM,OAAA,GAAU,iBAAkB,EAAE,IAAM,EAAA,GAAA,EAAK,KAAK,KAAO,EAAA,OAAA,EAAS,MAAAA,EAAAA,OAAAA,EAAU,EAAA;AAC5E,EAAM,MAAA,CAAA,GAAI,EAAE,GAAG,MAAM,GAAA,CAAI,IAAI,CAAG,EAAA,KAAA,EAAO,OAAS,EAAA,MAAA,EAAAA,OAAO,EAAA,CAAA;AACvD,EAAM,MAAA,WAAA,GAAc,MAAM,MAAA,CAAO,CAAC,CAAA,CAAA;AAElC,EAAA,MAAM,EAAE,KAAO,EAAA,CAAC,KAAO,EAAA,IAAI,GAAM,GAAA,WAAA,CAAA;AACjC,EAAM,MAAA,SAAA,GAAY,MAAM,GAAA,CAAI,KAAK,CAAA,CAAA;AACjC,EAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,EAAE,GAAK,EAAA,IAAA,EAAM,GAAK,EAAA,KAAA,EAAO,OAAS,EAAA,KAAA,EAAO,MAAAA,EAAAA,OAAAA,EAAQ,CAAA,CAAA;AAC3E,EAAA,MAAM,EAAE,MAAQ,EAAA,KAAA,EAAU,GAAA,MAAM,OAAO,aAAc,EAAA,CAAA;AACrD,EAAM,MAAA,MAAA,GAAS,OAAO,MAAW,KAAA;AAC/B,IAAA,MAAM,EAAE,KAAA,EAAO,GAAI,EAAA,GAAI,MAAM,KAAM,CAAA,OAAA,CAAQ,EAAE,GAAG,MAAQ,EAAA,GAAA,EAAK,CAAA,CAAE,MAAM,CAAK,CAAA,KAAA;AACxE,MAAQ,OAAA,CAAA,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAA;AACrB,MAAA,MAAM,IAAI,KAAM,CAAA,WAAA,GAAc,GAAI,CAAA,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,KAClD,CAAA,CAAA;AACD,IAAA,MAAM,KAAQ,GAAA,MAAM,WAAY,CAAA,KAAA,EAAO,GAAG,CAAA,CAAA;AAC1C,IAAO,OAAA,KAAA,CAAA;AAAA,GACT,CAAA;AACA,EAAA,MAAM,WAAW,EAAC,CAAA;AAClB,EAAW,KAAA,MAAA,EAAE,GAAI,EAAA,IAAK,KAAO,EAAA;AAC3B,IAAA,IAAI,CAAC,SAAA,CAAU,GAAI,CAAA,MAAA,CAAO,GAAG,CAAA;AAAG,MAAA,QAAA,CAAS,KAAK,GAAI,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAAA,GACrE;AACA,EAAQ,OAAA,QAAA,CAAA;AACR,EAAA,MAAM,OAAO,SAAS,CAAA,CAAA;AACxB,CAAA;;AC5BO,SAAS,QAAS,CAAG,EAAA;AAC1B,EAAA,IAAI,IAAI,CAAE,CAAA,UAAA,CAAA;AACV,EAAA,IAAI,EAAK,GAAA,CAAA,CAAA;AACT,EAAI,IAAA,CAAA,CAAA;AAAG,EAAI,IAAA,CAAA,CAAA;AAAG,EAAI,IAAA,CAAA,CAAA;AAAG,EAAI,IAAA,CAAA,CAAA;AAAG,EAAI,IAAA,CAAA,CAAA;AAChC,EAAA,MAAM,CAAI,GAAA,WAAA,CAAY,IAAK,CAAA,CAAC,CAAI,GAAA,UAAA,EAAY,CAAI,GAAA,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,UAAU,CAAC,CAAA,CAAA;AAC/E,EAAM,MAAA,CAAA,GAAI,IAAI,WAAA,CAAY,EAAE,CAAA,CAAA;AAC5B,EAAM,MAAA,OAAA,GAAW,CAAI,GAAA,CAAA,GAAI,CAAK,GAAA,EAAA,CAAA;AAC9B,EAAA,MAAM,KAAQ,GAAA,IAAI,WAAY,CAAA,OAAA,GAAU,CAAC,CAAA,CAAA;AACzC,EAAI,IAAA,CAAA,CAAA;AAEJ,EAAM,KAAA,CAAA,OAAO,IAAI,CAAI,GAAA,CAAA,CAAA;AACrB,EAAA,KAAA,CAAM,CAAK,IAAA,CAAC,CAAK,IAAA,GAAA,KAAS,CAAC,CAAK,IAAA,CAAA,CAAA,CAAA;AAChC,EAAA,OAAM,CAAM,EAAA,IAAA;AACV,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,KAAM,CAAC,CAAK,IAAA,CAAA,CAAA,CAAA;AAAA,GAClC;AAEA,EAAK,KAAA,CAAA,GAAI,CAAE,CAAA,KAAA,EAAS,EAAA,EAAA,GAAK,OAAS,EAAA,EAAA,IAAM,EAAI,EAAA,CAAA,CAAE,GAAI,CAAA,CAAC,CAAG,EAAA;AACpD,IAAA,KAAK,IAAI,CAAG,EAAA,CAAA,GAAI,IACd,CAAE,CAAA,CAAC,KACD,CAAM,GAAA,CAAA,CAAA,CAAA,GAAI,EAAE,CAAC,CAAA,KAAM,IAAI,CAAM,KAAA,EAAA,IACnB,EAAE,CAAC,CAAA,IACF,EAAE,CAAC,CAAA,GAAK,IAAI,EAAM,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,KAAK,CAAI,GAAA,CAAA,KAAM,MAClD,UACV,EAAA,CAAA,GAAI,EAAE,CAAC,CAAA,EACP,IAAI,CAAE,CAAA,CAAC,GACP,CAAI,GAAA,CAAA,CAAE,CAAC,CACP,EAAA,CAAA,IAAA,CAAM,CAAI,GAAA,CAAA,GAAI,KAAK,CACf,IAAA,CAAA,KAAM,KACH,CAAI,GAAA,CAAA,GAAI,MAAM,CAAI,GAAA,CAAA,GAAI,aAAa,SACnC,CAAA,GAAA,CAAA,CAAA,GAAI,IAAI,CAAI,GAAA,CAAA,GAAI,IAAI,CAAK,IAAA,SAAA,GAC5B,IAAI,CAAI,GAAA,CAAC,IAAI,CAGjB,CAAA,CAAA,EAAA,CAAA,CAAE,CAAC,CAAI,GAAA,CAAA,EACP,EAAE,CAAC,CAAA,GAAI,KAAK,EAAK,GAAA,CAAA,KAAM,GACvB,CAAE,CAAA,CAAC,IAAI,CACP,EAAA,CAAA,CAAE,CAAC,CAAI,GAAA,CAAA,EACP,EAAE,CACJ,EAAA;AACA,MAAA,CAAA,GAAI,CAAE,CAAA,CAAA,GAAI,CAAC,CAAA,GAAI,EAAE,CAAI,GAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAI,GAAA,EAAE,CAAI,GAAA,CAAA,CAAE,IAAI,EAAE,CAAA,CAAA;AAAA,KAChD;AAEA,IAAA,KAAK,IAAI,CAAG,EAAA,CAAA;AAAI,MAAA,CAAA,CAAE,EAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA;AAAA,GACrC;AAMA,EAAA,OAAO,IAAI,UAAW,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,UAAA,EAAY,EAAE,UAAU,CAAA,CAAA;AAC5D;;AChEA,MAAM,OAAA,GAAU,GAAG,CAAC,CAAA,CAAA;AAEpB,MAAM,UAAA,GAAa,QAAQ,GAAK,EAAA,UAAA,CAAA;AAGzB,MAAM,KAAM,CAAA;AAAA,EACjB,GAAM,GAAA,IAAA,CAAA;AAAA,EACN,IAAO,GAAA,IAAA,CAAA;AAAA,EACP,WAAc,GAAA,IAAA,CAAA;AAAA,EACd,eAAA,uBAAsB,GAAI,EAAA,CAAA;AAAA,EAC1B,WAAc,GAAA,IAAA,CAAA;AAAA,EACd,KAAQ,GAAA,MAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,cAAiB,GAAA,IAAA,CAAA;AAAA,EAEjB,WAAA,CAAa,IAAO,GAAA,SAAA,EAAW,WAAa,EAAA;AAC1C,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,IAAA,IAAA,CAAK,eAAe,WAAW,CAAA,CAAA;AAC/B,IAAA,IAAA,CAAK,WAAc,GAAA,UAAA,CAAW,OAAO,KAAA,EAAO,QAAa,KAAA;AACvD,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,cAAA;AAAA,QACA,KAAM,CAAA,MAAA;AAAA,QACN,KAAA,CAAM,OAAO,CAAC,GAAA,EAAK,MAAM,GAAM,GAAA,CAAA,CAAE,KAAM,CAAA,MAAA,EAAQ,CAAC,CAAA;AAAA,OAClD,CAAA;AACA,MAAA,IAAI,KAAK,cAAgB,EAAA;AAEvB,QAAA,OAAO,MAAM,IAAA,CAAK,MAAO,CAAA,OAAM,EAAM,KAAA;AACnC,UAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,YAAA,MAAM,IAAK,CAAA,cAAA,CAAe,IAAK,CAAA,MAAA,EAAQ,KAAK,KAAK,CAAA,CAAA;AAEjD,YAAA,MAAM,UAAU,MAAM,EAAA,CAAG,GAAI,CAAA,UAAA,EAAY,KAAK,MAAM,CAAA,CAAA;AACpD,YAAA,OAAO,OAAQ,CAAA,OAAA,CAAA;AACf,YAAM,MAAA,EAAA,CAAG,GAAI,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAAA,WAClC;AAAA,SACD,CAAA,CAAA;AAAA,OACH;AACA,MAAS,QAAA,EAAA,CAAA;AAAA,KACV,CAAA,CAAA;AAED,IAAK,IAAA,CAAA,WAAA,CAAY,MAAM,YAAY;AACjC,MAAA,OAAO,MAAM,IAAA,CAAK,MAAO,CAAA,OAAM,EAAM,KAAA;AACnC,QAAM,MAAA,OAAA,GAAA,CAAW,MAAM,EAAA,CAAG,eAAgB,CAAA,UAAA,EAAY,SAAS,CAAG,EAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,GAAG,CAAA,CAAA;AAChF,QAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,UAAM,MAAA,IAAA,CAAK,eAAe,MAAQ,EAAA,MAAM,GAAG,GAAI,CAAA,MAAA,EAAQ,MAAM,CAAC,CAAA,CAAA;AAC9D,UAAA,MAAM,OAAU,GAAA,MAAM,EAAG,CAAA,GAAA,CAAI,YAAY,MAAM,CAAA,CAAA;AAC/C,UAAA,OAAO,OAAQ,CAAA,OAAA,CAAA;AACf,UAAM,MAAA,EAAA,CAAG,GAAI,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAAA,SAClC;AAAA,OACD,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,cAAkB,GAAA;AAChB,IAAA,OAAO,IAAK,CAAA,WAAA,CAAA;AAAA,GACd;AAAA,EAEA,eAAgB,EAAI,EAAA;AAClB,IAAI,IAAA,EAAA,IAAM,CAAC,UAAY,EAAA;AACrB,MAAA,MAAM,MAAM,UAAW,CAAA,IAAA,CAAK,OAAO,IAAK,CAAA,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAClD,MAAA,IAAA,CAAK,WAAc,GAAA,EAAA,CAAA;AACnB,MAAM,MAAA,IAAA,GAAOE,QAAS,GAAG,CAAA,CAAA;AACzB,MAAA,IAAA,CAAK,QAAQ,MAAO,CAAA,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,KAAK,CAAA,CAAA;AAAA,KACxC,MAAA;AACL,MAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAA;AACnB,MAAA,IAAA,CAAK,KAAQ,GAAA,MAAA,CAAA;AAAA,KACf;AAAA,GAEF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAkB,CAAA,eAAA,EAAiB,IAAM,EAAA;AAC7C,IAAA,IAAI,gBAAgB,OAAS,EAAA;AAC3B,MAAA,IAAI,KAAK,WAAa,EAAA;AAEpB,QAAA,MAAM,SAAS,MAAM,yBAAA,CAA0B,gBAAgB,OAAS,EAAA,eAAA,EAAiB,KAAK,WAAW,CAAA,CAAA;AACzG,QAAM,MAAA,IAAA,CAAK,QAAQ,MAAO,CAAA,GAAA,CAAI,UAAY,EAAA,MAAA,CAAO,OAAO,IAAI,CAAA,CAAA;AAAA,OACvD,MAAA;AACL,QAAA,MAAM,MAAS,GAAA,MAAM,gBAAiB,CAAA,eAAA,CAAgB,SAAS,eAAe,CAAA,CAAA;AAC9E,QAAM,MAAA,IAAA,CAAK,QAAQ,MAAO,CAAA,GAAA,CAAI,UAAY,EAAA,MAAA,CAAO,OAAO,IAAI,CAAA,CAAA;AAAA,OAC9D;AAAA,KACF;AAAA,GACF;AAAA,EAEA,MAAA,GAAS,OAAM,SAAa,KAAA;AAC1B,IAAI,IAAA,CAAC,KAAK,GAAK,EAAA;AACb,MAAK,IAAA,CAAA,GAAA,GAAM,MAAM,MAAO,CAAA,CAAA,GAAA,EAAM,KAAK,KAAS,CAAA,CAAA,EAAA,IAAA,CAAK,cAAc,CAAG,EAAA;AAAA,QAChE,OAAS,CAAA,EAAA,EAAI,UAAY,EAAA,UAAA,EAAY,WAAa,EAAA;AAChD,UAAA,IAAI,aAAa,CAAG,EAAA;AAClB,YAAA,EAAA,CAAG,kBAAkB,MAAM,CAAA,CAAA;AAC3B,YAAA,MAAM,WAAW,EAAG,CAAA,iBAAA,CAAkB,YAAY,EAAE,OAAA,EAAS,OAAO,CAAA,CAAA;AACpE,YAAA,QAAA,CAAS,YAAY,MAAQ,EAAA,MAAA,EAAQ,EAAE,UAAA,EAAY,MAAM,CAAA,CAAA;AAAA,WAC3D;AACA,UAAA,IAAI,aAAa,CAAG,EAAA;AAClB,YAAM,MAAA,QAAA,GAAW,WAAY,CAAA,WAAA,CAAY,UAAU,CAAA,CAAA;AACnD,YAAS,QAAA,CAAA,WAAA,CAAY,WAAW,SAAS,CAAA,CAAA;AAAA,WAC3C;AAAA,SACF;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AACA,IAAO,OAAA,MAAM,SAAU,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAAA,GACjC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,CAAS,MAAQ,EAAA,KAAA,EAAO,IAAM,EAAA;AAClC,IAAM,MAAA,IAAA,CAAK,MAAO,CAAA,OAAM,EAAM,KAAA;AAC5B,MAAA,MAAM,KAAK,EAAG,CAAA,WAAA,CAAY,CAAC,MAAQ,EAAA,UAAU,GAAG,WAAW,CAAA,CAAA;AAC3D,MAAA,MAAM,GAAG,WAAY,CAAA,MAAM,CAAE,CAAA,GAAA,CAAI,OAAO,MAAM,CAAA,CAAA;AAC9C,MAAA,MAAM,EAAG,CAAA,WAAA,CAAY,UAAU,CAAA,CAAE,IAAI,EAAE,OAAA,EAAS,GAAK,EAAA,GAAA,EAAK,QAAQ,IAAM,EAAA,KAAA,CAAM,IAAK,CAAA,IAAI,GAAG,CAAA,CAAA;AAC1F,MAAA,OAAO,MAAM,EAAG,CAAA,IAAA,CAAA;AAAA,KACjB,CAAA,CAAA;AAGD,IAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,MAAA,IAAI,IAAK,CAAA,eAAA,CAAgB,GAAI,CAAA,MAAM,CAAG,EAAA;AAEpC,QAAA,OAAA;AAAA,OACF;AAGA,MAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAO,CAAA,CAAA;AACvC,MAAK,IAAA,CAAA,eAAA,CAAgB,IAAI,MAAM,CAAA,CAAA;AAAA,KAGjC;AAAA,GACF;AAAA,EAEA,mBAAsB,GAAA,IAAA,CAAA;AAAA,EAEtB,MAAM,SAAU,OAAS,EAAA;AACvB,IAAA,OAAO,MAAM,IAAA,CAAK,MAAO,CAAA,OAAM,EAAM,KAAA;AACnC,MAAA,MAAM,KAAK,EAAG,CAAA,WAAA,CAAY,CAAC,MAAQ,EAAA,UAAU,GAAG,UAAU,CAAA,CAAA;AAC1D,MAAM,MAAA,SAAA,GAAY,MAAM,EAAA,CAAG,WAAY,CAAA,UAAU,EAAE,KAAM,CAAA,MAAM,CAAE,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAC5E,MAAA,MAAM,SAAS,SAAW,EAAA,GAAA,CAAA;AAC1B,MAAA,IAAI,CAAC,MAAQ,EAAA;AACX,QAAM,MAAA,IAAI,KAAM,CAAA,iBAAA,GAAoB,OAAO,CAAA,CAAA;AAAA,OAC7C;AACA,MAAA,MAAM,WAAW,MAAM,EAAA,CAAG,YAAY,MAAM,CAAA,CAAE,IAAI,MAAM,CAAA,CAAA;AACxD,MAAA,MAAM,MAAS,GAAA,MAAM,SAAU,CAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AACjD,MAAA,IAAI,KAAK,WAAa,EAAA;AACpB,QAAM,MAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,QAAS,EAAA,CAAA;AACpC,QAAM,MAAA,kBAAA,GAAqB,OAAM,GAAO,KAAA;AACtC,UAAA,MAAM,GAAM,GAAA,MAAM,MAAO,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAEhC,UAAA,IAAI,QAAW,GAAA,KAAA,CAAA;AACf,UAAA,IAAI,IAAI,QAAS,EAAA,CAAE,OAAQ,CAAA,MAAM,MAAM,CAAG,EAAA;AACxC,YAAW,QAAA,GAAA,OAAA,CAAA;AAAA,WACb;AACA,UAAM,MAAA,OAAA,GAAU,MAAM,KAAA,CAAM,MAAO,CAAA;AAAA,YACjC,GAAG,GAAA;AAAA,YACH,KAAO,EAAA,QAAA;AAAA,YACP,MAAQ,EAAA,MAAA;AAAA,WACT,CAAA,CAAA;AAED,UAAO,OAAA,OAAA,CAAA;AAAA,SACT,CAAA;AACA,QAAM,MAAA,EAAE,MAAO,EAAA,GAAI,MAAM,2BAAA,CAA4B,MAAM,CAAC,CAAA,EAAG,kBAAoB,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AACnG,QAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,GAAI,CAAA,QAAA,OAAe,OAAO,CAAA,CAAA;AAC3D,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,OAAO,KAAM,CAAA,KAAA,CAAA;AAAA,SACf;AAAA,OACK,MAAA;AACL,QAAA,MAAM,WAAW,MAAM,MAAA,CAAO,IAAIC,KAAI,CAAA,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AACpD,QAAA,IAAI,QAAU,EAAA;AACZ,UAAA,OAAO,QAAS,CAAA,KAAA,CAAA;AAAA,SAClB;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAA;AAEA,MAAM,gBAAA,GAAmB,OAAO,OAAA,EAAS,MAAW,KAAA;AAClD,EAAA,IAAI,IAAO,GAAA,CAAA,CAAA;AACX,EAAM,MAAA,UAAA,GAAa,IAAI,YAAa,CAAA,EAAE,OAAO,CAAC,OAAO,GAAG,CAAA,CAAA;AACxD,EAAQ,IAAA,IAAA,UAAA,CAAA;AACR,EAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,MAAM,CAAG,EAAA;AAC1B,IAAA,MAAA,GAAS,KAAM,CAAA,IAAA,CAAK,MAAO,CAAA,OAAA,EAAS,CAAA,CAAA;AAAA,GACtC;AACA,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAM,EAAA,IAAK,MAAQ,EAAA;AACnC,IAAA,IAAA,IAAQ,GAAI,CAAA,WAAA,CAAY,EAAE,GAAA,EAAK,OAAO,CAAA,CAAA;AAAA,GACxC;AACA,EAAM,MAAA,MAAA,GAAS,IAAI,UAAA,CAAW,IAAI,CAAA,CAAA;AAClC,EAAA,MAAM,SAAS,MAAM,GAAA,CAAI,aAAa,MAAQ,EAAA,EAAE,YAAY,CAAA,CAAA;AAE5D,EAAA,MAAA,CAAO,QAAQ,OAAO,CAAA,CAAA;AAEtB,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAM,EAAA,IAAK,MAAQ,EAAA;AACnC,IAAA,MAAA,CAAO,KAAM,CAAA,EAAE,GAAK,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,GAC7B;AACA,EAAA,MAAM,OAAO,KAAM,EAAA,CAAA;AACnB,EAAO,OAAA,MAAM,KAAM,CAAA,MAAA,CAAO,EAAE,KAAA,EAAO,MAAO,CAAA,KAAA,EAAO,MAAQ,EAAA,MAAA,EAAQ,KAAO,EAAA,GAAA,EAAK,CAAA,CAAA;AAC/E,CAAA,CAAA;AAEA,MAAM,yBAA4B,GAAA,OAAO,2BAA6B,EAAA,MAAA,EAAQ,WAAgB,KAAA;AAC5F,EAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,IAAK,CAAA,WAAA,EAAa,KAAK,CAAA,CAAA;AACpD,EAAA,MAAM,kBAAkB,EAAC,CAAA;AACzB,EAAA,MAAM,UAAU,EAAC,CAAA;AACjB,EAAA,KAAA,MAAW,EAAE,GAAA,EAAS,IAAA,MAAA,CAAO,SAAW,EAAA;AACtC,IAAQ,OAAA,CAAA,IAAA,CAAK,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,GAC7B;AAEA,EAAI,IAAA,IAAA,CAAA;AACJ,EAAA,WAAA,MAAiB,SAAS,OAAQ,CAAA;AAAA,IAChC,IAAM,EAAA,OAAA;AAAA,IACN,GAAK,EAAA,OAAM,GAAO,KAAA,MAAA,CAAO,IAAI,GAAG,CAAA;AAAA;AAAA,IAChC,GAAK,EAAA,aAAA;AAAA,IACL,MAAQ,EAAA,MAAA;AAAA,IACR,OAAA;AAAA,WACAC,OAAA;AAAA;AAAA,IAEA,IAAM,EAAA,2BAAA;AAAA,GACP,CAAG,EAAA;AACF,IAAA,eAAA,CAAgB,KAAK,KAAK,CAAA,CAAA;AAC1B,IAAO,IAAA,GAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,YAAe,GAAA,MAAM,gBAAiB,CAAA,IAAA,CAAK,KAAK,eAAe,CAAA,CAAA;AACrE,EAAO,OAAA,YAAA,CAAA;AACT,CAAA,CAAA;AAGA,MAAM,yBAAA,uBAAgC,GAAI,EAAA,CAAA;AAC1C,MAAM,2BAA8B,GAAA,OAAO,GAAK,EAAA,GAAA,EAAK,WAAgB,KAAA;AACnE,EAAA,IAAI,yBAA0B,CAAA,GAAA,CAAI,GAAI,CAAA,QAAA,EAAU,CAAG,EAAA;AACjD,IAAA,OAAO,yBAA0B,CAAA,GAAA,CAAI,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,GAC9C,MAAA;AACL,IAAA,MAAM,iBAAiB,YAAY;AACjC,MAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,IAAK,CAAA,WAAA,EAAa,KAAK,CAAA,CAAA;AAEpD,MAAM,MAAA,IAAA,uBAAW,GAAI,EAAA,CAAA;AACrB,MAAA,MAAM,kBAAkB,EAAC,CAAA;AACzB,MAAA,WAAA,MAAiB,SAAS,OAAQ,CAAA;AAAA,QAChC,IAAM,EAAA,GAAA;AAAA,QACN,GAAA;AAAA,QACA,GAAK,EAAA,aAAA;AAAA,QACL,OAAA;AAAA,QACA,MAAQ,EAAA,MAAA;AAAA,eACRA,OAAA;AAAA;AAAA,OAED,CAAG,EAAA;AACF,QAAA,eAAA,CAAgB,KAAK,KAAK,CAAA,CAAA;AAC1B,QAAA,IAAA,CAAK,GAAI,CAAA,KAAA,CAAM,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,OAC/B;AACA,MAAO,OAAA,EAAE,MAAQ,EAAA,eAAA,EAAiB,IAAK,EAAA,CAAA;AAAA,KACtC,GAAA,CAAA;AACH,IAAA,yBAAA,CAA0B,GAAI,CAAA,GAAA,CAAI,QAAS,EAAA,EAAG,aAAa,CAAA,CAAA;AAC3D,IAAO,OAAA,aAAA,CAAA;AAAA,GACT;AACF,CAAA;;ACjRA,MAAM,SAAA,uBAAgB,GAAI,EAAA,CAAA;AAC1B,MAAM,MAAA,GAAS,CAAC,EAAA,EAAI,MAAW,KAAA;AAC7B,EAAA,IAAI,CAAC,SAAA,CAAU,GAAI,CAAA,EAAE,CAAG,EAAA;AACtB,IAAU,SAAA,CAAA,GAAA;AAAA,MACR,EAAA;AAAA,MACA,MAAA,EAAS,CAAA,OAAA,CAAQ,MAAM,UAAA,CAAW,MAAM,SAAA,CAAU,MAAO,CAAA,EAAE,CAAG,EAAA,GAAG,CAAC,CAAA;AAAA,KACpE,CAAA;AAAA,GACF;AACA,EAAO,OAAA,SAAA,CAAU,IAAI,EAAE,CAAA,CAAA;AACzB,CAAA,CAAA;AAiBO,MAAM,qBAAsB,CAAA;AAAA;AAAA,EAEjC,eAAA,uBAAsB,GAAI,EAAA,CAAA;AAAA,EAE1B,KAAQ,GAAA,IAAA,CAAA;AAAA,EAER,UAAA,GAAa,OAAU,GAAA,IAAA,CAAK,MAAO,EAAA,CAAE,SAAS,EAAE,CAAA,CAAE,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,EAChE,oBAAA,uBAA2B,GAAI,EAAA,CAAA;AAAA,EAE/B,WAAA,CAAa,MAAM,aAAe,EAAA;AAChC,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAI,KAAM,CAAA,IAAA,EAAM,aAAa,CAAA,CAAA;AAAA,GAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAK,GAAK,EAAA;AACd,IAAM,MAAA,GAAA,GAAM,IAAI,QAAS,EAAA,CAAA;AAEzB,IAAA,MAAM,QAAQ,MAAM,OAAA,CAAQ,GAAI,CAAA,CAAC,KAAK,eAAgB,CAAA,GAAG,CAAG,EAAA,IAAA,CAAK,aAAa,GAAG,CAAC,CAAC,CAAA,CAAE,MAAM,CAAK,CAAA,KAAA;AAE9F,MAAO,OAAA,IAAA,CAAK,WAAW,GAAG,CAAA,CAAA;AAAA,KAC3B,CAAA,CAAA;AACD,IAAA,IAAI,CAAC,KAAA;AAAO,MAAM,MAAA,IAAI,KAAM,CAAA,iBAAA,GAAoB,GAAG,CAAA,CAAA;AACnD,IAAO,OAAA,EAAE,KAAK,KAAM,EAAA,CAAA;AAAA,GACtB;AAAA;AAAA;AAAA,EAIA,MAAM,gBAAiB,GAAK,EAAA;AAC1B,IAAW,KAAA,MAAA,WAAA,IAAe,KAAK,oBAAsB,EAAA;AACnD,MAAA,MAAM,GAAM,GAAA,MAAM,WAAY,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AACrC,MAAA,IAAI,OAAO,GAAI,CAAA,KAAA;AAAO,QAAA,OAAO,GAAI,CAAA,KAAA,CAAA;AAAA,KACnC;AACA,IAAM,MAAA,IAAI,KAAM,CAAA,iBAAA,GAAoB,GAAG,CAAA,CAAA;AAAA,GACzC;AAAA,EAEA,MAAM,aAAc,GAAK,EAAA;AACvB,IAAA,MAAM,GAAM,GAAA,IAAA,CAAK,eAAgB,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AACxC,IAAI,IAAA,GAAA;AAAK,MAAO,OAAA,GAAA,CAAA;AAChB,IAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,KAAA,CAAM,SAAS,GAAG,CAAA,CAAA;AAEzC,IAAK,IAAA,CAAA,eAAA,CAAgB,GAAI,CAAA,GAAA,EAAK,GAAG,CAAA,CAAA;AACjC,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAM,mBAAuB,GAAA;AAC3B,IAAA,IAAA,CAAK,gBAAgB,KAAM,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,MAAM,WAAY,GAAK,EAAA;AACrB,IAAI,IAAA,IAAA,CAAK,MAAM,mBAAqB,EAAA;AAElC,MAAM,MAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,GAAK,EAAA,YAAY,MAAM,IAAK,CAAA,KAAA,CAAM,mBAAoB,CAAA,GAAG,CAAC,CAAA,CAAA;AACrF,MAAA,IAAI,KAAO,EAAA;AAET,QAAA,aAAA,CAAc,cAAiB,GAAA,GAAA,EAAK,IAAM,EAAA,OAAM,eAAmB,KAAA;AACjE,UAAA,MAAM,gBAAgB,GAAI,CAAA,GAAA,CAAI,KAAM,CAAA,GAAG,GAAG,KAAK,CAAA,CAAA;AAAA,SAChD,CAAA,CAAA;AACD,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACK,MAAA;AACL,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,GAAA,CAAK,KAAK,KAAO,EAAA;AACf,IAAM,MAAA,IAAI,MAAM,0BAA0B,CAAA,CAAA;AAAA,GAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,KAAA,CAAO,QAAQ,EAAI,EAAA;AACjB,IAAA,MAAM,0BAA6B,GAAA,IAAI,eAAgB,CAAA,KAAA,EAAO,IAAI,CAAA,CAAA;AAClE,IAAK,IAAA,CAAA,oBAAA,CAAqB,IAAI,0BAA0B,CAAA,CAAA;AACxD,IAAO,OAAA,0BAAA,CAAA;AAAA,GACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAQ,eAAiB,EAAA;AAC7B,IAAM,MAAA,IAAA,CAAK,SAAS,eAAe,CAAA,CAAA;AAAA,GACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,GAAW,OAAM,eAAmB,KAAA;AAClC,IAAM,MAAA,IAAA,uBAAW,GAAI,EAAA,CAAA;AACrB,IAAA,KAAA,MAAW,EAAE,GAAK,EAAA,KAAA,EAAW,IAAA,eAAA,CAAgB,SAAW,EAAA;AACtD,MAAM,MAAA,SAAA,GAAY,IAAI,QAAS,EAAA,CAAA;AAC/B,MAAA,IAAI,IAAK,CAAA,eAAA,CAAgB,GAAI,CAAA,SAAS,CAAG,EAAA,CAElC,MAAA;AACL,QAAK,IAAA,CAAA,eAAA,CAAgB,GAAI,CAAA,SAAA,EAAW,KAAK,CAAA,CAAA;AACzC,QAAA,IAAA,CAAK,IAAI,SAAS,CAAA,CAAA;AAAA,OACpB;AAAA,KACF;AACA,IAAI,IAAA,IAAA,CAAK,OAAO,CAAG,EAAA;AAEjB,MAAA,MAAM,IAAK,CAAA,KAAA,CAAM,gBAAiB,CAAA,eAAA,EAAiB,IAAI,CAAA,CAAA;AAAA,KACzD;AAAA,GACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAQ,eAAiB,EAAA;AACvB,IAAK,IAAA,CAAA,oBAAA,CAAqB,OAAO,eAAe,CAAA,CAAA;AAAA,GAClD;AACF,CAAA;AAWO,MAAM,aAAgB,GAAA,OAAO,KAAO,EAAA,UAAA,EAAY,KAAU,KAAA;AAE/D,EAAA,IAAI,CAAC,UAAW,CAAA,MAAA;AAAQ,IAAO,OAAA,MAAM,MAAM,UAAU,CAAA,CAAA;AAErD,EAAM,MAAA,eAAA,GAAkB,UAAW,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAC9C,EAAI,IAAA;AACF,IAAM,MAAA,MAAA,GAAS,MAAM,KAAA,CAAM,eAAe,CAAA,CAAA;AAE1C,IAAM,MAAA,UAAA,CAAW,OAAO,eAAe,CAAA,CAAA;AACvC,IAAO,OAAA,MAAA,CAAA;AAAA,WACA,CAAP,EAAA;AACA,IAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,YAAA,EAAe,KAAgB,CAAA,OAAA,CAAA,EAAA,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA;AACvD,IAAM,MAAA,CAAA,CAAA;AAAA,GACN,SAAA;AAEA,IAAA,UAAA,CAAW,OAAO,eAAe,CAAA,CAAA;AAAA,GACnC;AACF,CAAA,CAAA;AAEO,MAAM,eAAgB,CAAA;AAAA;AAAA,EAE3B,MAAA,uBAAa,GAAI,EAAA,CAAA;AAAA,EACjB,OAAU,GAAA,IAAA,CAAA;AAAA,EACV,KAAQ,GAAA,EAAA,CAAA;AAAA,EACR,gBAAmB,GAAA,IAAA,CAAA;AAAA,EAEnB,WAAA,CAAa,OAAO,gBAAkB,EAAA;AACpC,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AACb,IAAA,IAAA,CAAK,gBAAmB,GAAA,gBAAA,CAAA;AAAA,GAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAK,GAAK,EAAA;AACd,IAAM,MAAA,GAAA,GAAM,IAAI,QAAS,EAAA,CAAA;AACzB,IAAA,IAAI,KAAQ,GAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAC/B,IAAA,IAAI,KAAO,EAAA;AACT,MAAO,OAAA,EAAE,KAAK,KAAM,EAAA,CAAA;AAAA,KACtB;AACA,IAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,gBAAiB,CAAA,YAAA,CAAa,GAAG,CAAA,CAAA;AACpD,IAAA,IAAI,KAAO,EAAA;AACT,MAAO,OAAA,EAAE,KAAK,KAAM,EAAA,CAAA;AAAA,KACtB;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,GAAK,CAAA,GAAA,EAAK,KAAO,EAAA;AAErB,IAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,GAAI,CAAA,QAAA,IAAY,KAAK,CAAA,CAAA;AACrC,IAAA,IAAA,CAAK,OAAU,GAAA,GAAA,CAAA;AAAA,GACjB;AAAA,EAEA,CAAE,OAAW,GAAA;AACX,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAK,MAAQ,EAAA;AACtC,MAAA,MAAM,EAAE,GAAA,EAAK,KAAM,CAAA,GAAG,GAAG,KAAM,EAAA,CAAA;AAAA,KACjC;AAAA,GACF;AACF;;AC5OA,MAAM,SAAA,GAAY,SAAEA,OAAO,EAAA,OAAA,EAAS,GAAG,CAAC,CAAA,SAAGC,OAAO,UAAAL,MAAA,WAAQM,aAAQ,EAAA,CAAA;AAElE,MAAM,OAAA,GAAU,OAAO,KAAA,EAAO,EAAO,KAAA;AACnC,EAAM,MAAA,IAAA,GAAO,MAAM,EAAG,EAAA,CAAA;AAEtB,EAAO,OAAA,IAAA,CAAA;AACT,CAAA,CAAA;AAGa,MAAA,YAAA,GAAe,CAAC,MAAW,KAAA;AAEtC,EAAM,MAAA,UAAA,GAAa,OAAO,OAAY,KAAA;AACpC,IAAM,MAAA,EAAE,GAAK,EAAA,KAAA,EAAU,GAAA,MAAM,OAAQ,CAAA,OAAA,EAAS,MAAM,MAAA,CAAO,GAAI,CAAA,OAAO,CAAC,CAAA,CAAA;AAEvE,IAAA,OAAOC,SAAY,EAAE,GAAA,EAAK,KAAO,UAAAP,MAAA,SAAQK,SAAO,CAAA,CAAA;AAAA,GAClD,CAAA;AACA,EAAO,OAAA;AAAA;AAAA,IAEL,QAAU,EAAA,UAAA;AAAA,GACZ,CAAA;AACF,CAAA,CAAA;AAOA,eAAe,qBAAuB,CAAA;AAAA,EACpC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAAG,EAAAA,KAAAA;AAAA,EACA,KAAO,EAAA,OAAA;AAAA,EACP,IAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAW,EAAC;AACd,CAAG,EAAA;AACD,EAAI,IAAA,IAAA,CAAA;AACJ,EAAA,MAAM,EAAE,GAAA,EAAK,KAAO,EAAA,GAAA,EAAQ,GAAA,OAAA,CAAA;AAC5B,EAAA,MAAM,IAAO,GAAA;AAAA,IACX,MAAOA,KACH,GAAA;AAAA,MACE,KAAKA,KAAK,CAAA,GAAA;AAAA,MACV,OAAOA,KAAK,CAAA,KAAA;AAAA;AAAA,MACZ,OAAOA,KAAK,CAAA,KAAA;AAAA;AAAA,KAEd,GAAA,IAAA;AAAA,IACJ,GAAA;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,GAAK,EAAA;AACP,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAA;AACb,IAAA,IAAA,CAAK,IAAO,GAAA,KAAA,CAAA;AAAA,GACP,MAAA;AACL,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AACb,IAAA,IAAA,CAAK,IAAO,GAAA,KAAA,CAAA;AAAA,GACd;AAGA,EAAA,MAAM,KAAQ,GAAA,MAAM,UAAW,CAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AAChD,EAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAEX,EAAC,CAAA,EAAE,MAAM,IAAK,EAAA,GAAI,MAAM,OAAQ,CAAA,QAAA,EAAU,IAAM,EAAA,KAAA,CAAM,GAAG,CAAA,EAAA;AAE1D,EAAO,OAAA;AAAA,IACL,IAAAA,EAAAA,KAAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAW,EAAA,IAAA;AAAA,IACX,KAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEA,MAAM,kBAAA,GAAqB,CAAC,QAAa,KAAA;AAGvC,EAAA,MAAM,EAAE,QAAA,EAAU,IAAK,EAAA,GAAI,aAAa,QAAQ,CAAA,CAAA;AAChD,EAAA,MAAMC,IAAM,GAAA,QAAA,CAAS,GAAI,CAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AACtC,EAAM,MAAA,MAAA,GAAS,OAAO,KAAA,EAAO,SAAc,KAAA;AAEzC,IAAM,MAAA,EAAE,GAAK,EAAA,KAAA,EAAU,GAAA,KAAA,CAAA;AACvB,IAAAA,IAAAA,CAAI,KAAK,KAAK,CAAA,CAAA;AAEd,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,SAAA,CAAU,GAAI,CAAA,GAAA,CAAI,QAAS,EAAA,EAAG,KAAK,CAAA,CAAA;AAAA,KACrC;AAAA,GACF,CAAA;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,MAAQ,EAAA,MAAA,EAAQ,UAAU,IAAK,EAAA,CAAA;AACpD,CAAA,CAAA;AAEA,MAAM,cAAA,GAAiB,CAAC,MAAA,EAAQ,KAAU,KAAA;AACxC,EAAA,IAAI,KAAO,EAAA;AACT,IAAM,MAAA,MAAA,GAAS,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,EAAE,GAAK,EAAA,KAAA,CAAM,GAAI,EAAA,EAAI,EAAA,CAAA;AACrD,IAAA,IAAI,MAAM,GAAK,EAAA;AACb,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,IAAO,GAAA,KAAA,CAAA;AAAA,KACpB,MAAA;AACL,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,IAAO,GAAA,KAAA,CAAA;AACzB,MAAO,MAAA,CAAA,KAAA,CAAM,IAAK,CAAA,KAAA,GAAQ,KAAM,CAAA,KAAA,CAAA;AAAA,KAClC;AACA,IAAA,MAAA,CAAO,KAAK,MAAM,CAAA,CAAA;AAAA,GACpB;AACA,EAAM,MAAA,IAAA,uBAAW,GAAI,EAAA,CAAA;AACrB,EAAA,KAAA,MAAW,EAAE,KAAA,EAAOC,MAAM,EAAA,IAAK,MAAQ,EAAA;AACrC,IAAM,MAAA;AAAA,MACJ,IAAM,EAAA,EAAE,IAAM,EAAA,KAAA,EAAO,GAAI,EAAA;AAAA,KACvBA,GAAAA,MAAAA,CAAAA;AACJ,IAAM,MAAA,SAAA,GAAY,IAAS,KAAA,KAAA,GAAQ,EAAE,GAAA,EAAK,OAAU,GAAA,EAAE,GAAK,EAAA,GAAA,EAAK,IAAK,EAAA,CAAA;AACrE,IAAK,IAAA,CAAA,GAAA,CAAI,SAAU,CAAA,GAAA,EAAK,SAAS,CAAA,CAAA;AAAA,GACnC;AACA,EAAA,OAAO,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,MAAA,EAAQ,CAAA,CAAA;AACjC,CAAA,CAAA;AAUA,MAAM,sBAAyB,GAAA,OAAO,MAAQ,EAAA,QAAA,EAAU,QAAa,KAAA;AAEnE,EAAA,MAAM,KAAQ,GAAA,MAAM,MAAO,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AACvC,EAAA,MAAM,EAAE,IAAA,EAAAF,KAAK,EAAA,GAAI,MAAM,KAAM,CAAA,IAAA,CAAA;AAE7B,EAAA,IAAIA,KAAM,EAAA;AACR,IAAO,OAAAG,MAAA,CAAK,EAAE,GAAKH,EAAAA,KAAAA,CAAK,KAAK,GAAK,EAAA,QAAA,EAAU,GAAG,SAAA,EAAW,CAAA,CAAA;AAAA,GACrD,MAAA;AACL,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,OAAO,QAAU,EAAA,IAAA,EAAM,KAAU,KAAA;AACpD,EAAA,MAAM,EAAE,QAAA,EAAU,MAAO,EAAA,GAAI,mBAAmB,QAAQ,CAAA,CAAA;AACxD,EAAA,IAAI,aAAa,EAAC,CAAA;AAClB,EAAA,IAAI,cAAiB,GAAA,IAAA,CAAA;AACrB,EAAA,IAAI,KAAK,MAAQ,EAAA;AAEf,IAAM,MAAA,MAAA,GAAS,IAAI,YAAA,CAAa,MAAM,CAAA,CAAA;AAGtC,IAAA,MAAM,EAAE,QAAU,EAAA,MAAA,KAAW,MAAM,kCAAA,CAAmC,QAAQ,IAAI,CAAA,CAAA;AAClF,IAAa,UAAA,GAAA,MAAA,CAAA;AAEb,IAAA,cAAA,GAAiB,MAAM,sBAAA,CAAuB,MAAQ,EAAA,QAAA,EAAU,QAAQ,CAAA,CAAA;AAAA,GAE1E;AAEA,EAAM,MAAA,cAAA,GAAiB,cAAe,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAGvD,EAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,IAAIA,IAAAA,KAAAA,CAAAA;AACJ,IAAA,MAAM,YAAY,EAAC,CAAA;AAEnB,IAAA,IAAI,eAAe,KAAM,CAAA,CAAC,EAAO,KAAA,EAAA,CAAG,GAAG,CAAG,EAAA;AACxC,MAAA,OAAO,EAAE,IAAA,EAAM,IAAM,EAAA,MAAA,EAAQ,EAAG,EAAA,CAAA;AAAA,KAClC;AACA,IAAiB,WAAA,MAAA,IAAA,IAAQI,QAAO,CAAA,EAAE,GAAK,EAAA,QAAA,EAAU,MAAM,cAAgB,EAAA,GAAG,SAAU,EAAC,CAAG,EAAA;AACtF,MAAAJ,KAAAA,GAAO,MAAM,IAAK,CAAA,KAAA,CAAA;AAClB,MAAA,SAAA,CAAU,KAAKA,KAAI,CAAA,CAAA;AAAA,KACrB;AACA,IAAA,OAAO,EAAE,IAAA,EAAAA,KAAM,EAAA,MAAA,EAAQ,SAAU,EAAA,CAAA;AAAA,GAC5B,MAAA;AACL,IAAO,OAAA,MAAM,cAAe,CAAA,IAAA,CAAK,cAAc,CAAA,CAAA;AAAA,GACjD;AACF,CAAA,CAAA;AAWA,eAAsB,GAAK,CAAA,QAAA,EAAU,IAAM,EAAA,KAAA,EAAO,OAAS,EAAA;AACzD,EAAA,MAAM,EAAE,MAAA,EAAW,GAAA,kBAAA,CAAmB,QAAQ,CAAA,CAAA;AAG9C,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAM,MAAA,SAAA,uBAAgB,GAAI,EAAA,CAAA;AAC1B,IAAM,MAAA,EAAE,MAAAA,KAAM,EAAA,MAAA,KAAW,MAAM,YAAA,CAAa,QAAU,EAAA,IAAA,EAAM,KAAK,CAAA,CAAA;AACjE,IAAA,KAAA,MAAW,KAAK,MAAQ,EAAA;AACtB,MAAA,MAAA,CAAO,GAAG,SAAS,CAAA,CAAA;AAAA,KACrB;AACA,IAAA,OAAO,qBAAsB,CAAA,EAAE,QAAU,EAAA,MAAA,EAAQ,MAAAA,KAAM,EAAA,KAAA,EAAO,IAAM,EAAA,SAAA,EAAW,MAAM,IAAK,CAAA,SAAA,CAAU,MAAO,EAAC,GAAG,CAAA,CAAA;AAAA,GACjH;AACA,EAAM,MAAA,EAAE,IAAM,EAAA,iBAAA,EAAmB,MAAQ,EAAA,SAAA,KAAc,MAAM,YAAA,CAAa,QAAU,EAAA,IAAA,EAAM,KAAK,CAAA,CAAA;AAE/F,EAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,IAAA,OAAO,qBAAsB,CAAA;AAAA,MAC3B,QAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAM,EAAA,IAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAW,EAAC;AAAA,KACb,CAAA,CAAA;AAAA,GACI,MAAA;AACL,IAAM,MAAA,eAAA,GAAkB,MAAM,iBAAkB,CAAA,KAAA,CAAA;AAChD,IAAM,MAAA,SAAA,uBAAgB,GAAI,EAAA,CAAA;AAC1B,IAAA,MAAA,CAAO,iBAAiB,SAAS,CAAA,CAAA;AACjC,IAAA,KAAA,MAAW,MAAM,SAAW,EAAA;AAC1B,MAAA,MAAA,CAAO,IAAI,SAAS,CAAA,CAAA;AAAA,KACtB;AAEA,IAAA,OAAO,qBAAsB,CAAA;AAAA,MAC3B,QAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAM,EAAA,eAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAW,EAAA,KAAA,CAAM,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA;AAAA;AAAA,KACzC,CAAA,CAAA;AAAA,GACH;AACF,CAAA;AAQsB,eAAA,IAAA,CAAM,UAAU,IAAM,EAAA;AAC1C,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAM,MAAA,IAAI,MAAM,SAAS,CAAA,CAAA;AAAA,GAC3B;AACA,EAAM,MAAA,EAAE,IAAM,EAAA,iBAAA,EAAmB,MAAQ,EAAA,SAAA,EAAW,MAAS,GAAA,MAAM,YAAa,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAE9F,EAAA,MAAM,aAAc,CAAA,MAAA,EAAQ,QAAU,EAAA,OAAO,qBAA0B,KAAA;AACrE,IAAA,MAAM,EAAE,MAAA,EAAW,GAAA,kBAAA,CAAmB,qBAAqB,CAAA,CAAA;AAC3D,IAAA,KAAA,MAAW,MAAM,SAAW,EAAA;AAC1B,MAAA,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,KACX;AAAA,GACD,CAAA,CAAA;AACD,EAAO,OAAA,EAAE,IAAM,EAAA,IAAA,EAAM,iBAAkB,EAAA,CAAA;AACzC,CAAA;AASsB,eAAA,WAAA,CAAa,MAAQ,EAAA,IAAA,EAAM,KAAO,EAAA;AACtD,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAM,MAAA,IAAI,MAAM,SAAS,CAAA,CAAA;AAAA,GAC3B;AAEA,EAAA,MAAM,SAAY,GAAA,CAAC,GAAG,KAAA,EAAO,GAAG,IAAI,CAAA,CAAA;AACpC,EAAM,MAAA,EAAE,MAAM,MAAQ,EAAA,cAAA,KAAmB,MAAM,gBAAA,CAAiB,QAAQ,SAAS,CAAA,CAAA;AACjF,EAAA,OAAO,EAAE,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,eAAe,GAAI,CAAA,CAAC,EAAE,KAAA,EAAO,EAAE,IAAA,EAAO,EAAA,KAAM,IAAI,CAAE,EAAA,CAAA;AACtF,CAAA;AAUsB,eAAA,MAAA,CAAQ,QAAQ,IAAM,EAAA;AAG1C,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAO,OAAA,EAAE,SAAW,EAAA,IAAI,UAAW,EAAA,EAAG,IAAM,EAAA,IAAI,UAAW,EAAA,EAAG,MAAQ,EAAA,EAAG,EAAA,CAAA;AAAA,GAC3E;AACA,EAAM,MAAA,EAAE,MAAM,cAAgB,EAAA,IAAA,EAAM,WAAc,GAAA,MAAM,IAAK,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AACzE,EAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,IAAO,OAAA,EAAE,WAAW,IAAM,EAAA,IAAI,YAAc,EAAA,MAAA,EAAQ,EAAG,EAAA,CAAA;AAAA,GACzD;AACA,EAAA,MAAM,EAAE,MAAQ,EAAA,IAAA,EAAS,GAAA,MAAM,eAAe,aAAc,EAAA,CAAA;AAC5D,EAAA,OAAO,EAAE,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,GAAI,CAAA,CAAC,EAAE,GAAA,EAAK,OAAa,MAAA,EAAE,GAAK,EAAA,KAAA,GAAQ,CAAE,EAAA,CAAA;AACrF,CAAA;AAOsB,eAAA,GAAA,CAAK,MAAQ,EAAA,IAAA,EAAM,GAAK,EAAA;AAE5C,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAA,OAAO,EAAE,IAAM,EAAA,IAAI,UAAW,EAAA,EAAG,QAAQ,IAAK,EAAA,CAAA;AAAA,GAChD;AACA,EAAM,MAAA,EAAE,MAAM,cAAgB,EAAA,IAAA,EAAM,WAAc,GAAA,MAAM,IAAK,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AACzE,EAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,IAAA,OAAO,EAAE,SAAW,EAAA,IAAA,EAAM,IAAI,UAAW,EAAA,EAAG,QAAQ,IAAK,EAAA,CAAA;AAAA,GAC3D;AACA,EAAA,MAAM,EAAE,MAAQ,EAAA,IAAA,KAAS,MAAM,cAAA,CAAe,IAAI,GAAG,CAAA,CAAA;AACrD,EAAO,OAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,SAAU,EAAA,CAAA;AACnC,CAAA;AAEwB,gBAAA,GAAA,CAAK,QAAQ,IAAM,EAAA;AACzC,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAA,OAAO,EAAE,IAAM,EAAA,IAAI,UAAW,EAAA,EAAG,QAAQ,IAAK,EAAA,CAAA;AAAA,GAChD;AACA,EAAM,MAAA,EAAE,MAAM,cAAgB,EAAA,IAAA,KAAS,MAAM,IAAA,CAAK,QAAQ,IAAI,CAAA,CAAA;AAC9D,EAAA,MAAM,QAAQ,EAAC,CAAA;AACf,EAAiB,WAAA,MAAA,IAAA,IAAQ,cAAe,CAAA,GAAA,EAAO,EAAA;AAC7C,IAAM,MAAA,IAAA,CAAA;AACN,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,OAAO,EAAE,GAAK,EAAA,KAAA,CAAM,IAAK,CAAA,IAAI,GAAG,IAAK,EAAA,CAAA;AACvC,CAAA;AAEsB,eAAA,aAAA,CAAe,QAAQ,IAAM,EAAA;AACjD,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAA,OAAO,EAAE,IAAM,EAAA,IAAI,UAAW,EAAA,EAAG,QAAQ,IAAK,EAAA,CAAA;AAAA,GAChD;AACA,EAAM,MAAA,EAAE,MAAM,cAAgB,EAAA,IAAA,KAAS,MAAM,IAAA,CAAK,QAAQ,IAAI,CAAA,CAAA;AAC9D,EAAA,MAAM,QAAQ,EAAC,CAAA;AACf,EAAiB,WAAA,MAAA,IAAA,IAAQ,cAAe,CAAA,GAAA,EAAO,EAAA;AAC7C,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,OAAO,EAAE,GAAK,EAAA,KAAA,CAAM,IAAK,CAAA,IAAI,GAAG,IAAK,EAAA,CAAA;AACvC,CAAA;AAEsB,eAAA,cAAA,CAAgB,QAAQ,IAAM,EAAA;AAClD,EAAA,MAAM,QAAQ,EAAC,CAAA;AACf,EAAA,WAAA,MAAiB,IAAQ,IAAAK,KAAA,CAAS,MAAQ,EAAA,IAAI,CAAG,EAAA;AAE/C,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAE,EAAA,CAAA;AACjC;;ACpUO,MAAM,SAAU,CAAA;AAAA,EACrB,SAAA,uBAAgB,GAAI,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUpB,OAAO,OAAA,GAAU,CAAC,IAAA,GAAO,QAAa,KAAA;AACpC,IAAA,MAAM,WAAc,GAAA,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA,CAAA;AAGlD,IAAO,OAAA,IAAI,SAAU,CAAA,IAAI,qBAAsB,CAAA,IAAA,EAAM,WAAW,CAAA,EAAG,EAAC,EAAG,EAAE,IAAA,EAAM,CAAA,CAAA;AAAA,GACjF,CAAA;AAAA,EAEA,YAAa,MAAQ,EAAA,KAAA,EAAO,MAAQ,EAAA,OAAA,GAAU,EAAI,EAAA;AAChD,IAAK,IAAA,CAAA,IAAA,GAAO,QAAQ,IAAQ,IAAA,QAAA,CAAA;AAC5B,IAAA,IAAA,CAAK,UAAa,GAAA,CAAA,GAAA,EAAM,IAAK,CAAA,IAAA,CAAA,CAAA,EAAQ,IAAK,CAAA,MAAA,EAAS,CAAA,QAAA,CAAS,EAAE,CAAA,CAAE,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA,CAAA;AAC9E,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AACb,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA,CAAA;AACf,IAAK,IAAA,CAAA,OAAA,uBAAc,GAAI,EAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAU,GAAA;AAER,IAAO,OAAA;AAAA,MACL,KAAA,EAAO,KAAK,WAAY,EAAA;AAAA,MACxB,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,GAAK,EAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,cAAe,EAAA;AAAA,MACtC,OAAS,EAAA,CAAC,GAAG,IAAA,CAAK,OAAQ,CAAA,MAAA,EAAQ,CAAA,CAAE,GAAI,CAAA,CAAA,KAAA,KAAS,KAAM,CAAA,MAAA,EAAQ,CAAA;AAAA,KACjE,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAe,GAAA;AACb,IAAA,OAAO,KAAK,KAAM,CAAA,GAAA,CAAI,CAAO,GAAA,KAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAAA,GAC7C;AAAA,EAEA,OAAS,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,KAAO,EAAA;AAC7B,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AACb,IAAK,IAAA,CAAA,MAAA,CAAO,KAAM,CAAA,cAAA,CAAe,GAAG,CAAA,CAAA;AACpC,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAA;AAAA,GACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAe,GAAA;AACnB,IAAM,MAAA,IAAA,CAAK,gBAAgB,EAAE,MAAA,EAAQ,MAAM,MAAQ,EAAA,IAAA,CAAK,WAAY,EAAA,EAAG,CAAA,CAAA;AAAA,GACzE;AAAA;AAAA,EAGA,MAAM,cAAgB,CAAA,MAAA,GAAS,SAAW,EAAA;AACxC,IAAM,MAAA,IAAA,CAAK,gBAAgB,EAAE,SAAA,EAAW,QAAQ,MAAQ,EAAA,IAAA,CAAK,WAAY,EAAA,EAAG,CAAA,CAAA;AAAA,GAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAc,KAAO,EAAA;AAEzB,IAAA,IAAI,MAAM,QAAU,EAAA,SAAA,CAAA;AAEpB,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,MAAM,OAAO,MAAM,WAAA,CAAY,KAAK,MAAQ,EAAA,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA;AAC7D,MAAM,MAAA,OAAA,uBAAc,GAAI,EAAA,CAAA;AACxB,MAAW,KAAA,MAAA,EAAE,KAAK,IAAM,EAAA,KAAA,MAAW,IAAK,CAAA,MAAA,CAAO,GAAI,CAAA,WAAW,CAAG,EAAA;AAC/D,QAAA,IAAI,SAAS,KAAO,EAAA;AAClB,UAAA,OAAA,CAAQ,IAAI,GAAK,EAAA,EAAE,GAAK,EAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAA,SAC9B,MAAA;AACL,UAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,EAAE,GAAA,EAAK,OAAO,CAAA,CAAA;AAAA,SACjC;AAAA,OACF;AACA,MAAA,IAAA,GAAO,KAAM,CAAA,IAAA,CAAK,OAAQ,CAAA,MAAA,EAAQ,CAAA,CAAA;AAClC,MAAA,SAAA,GAAY,IAAK,CAAA,SAAA,CAAA;AAAA,KAEZ,MAAA;AACL,MAAA,MAAM,UAAU,MAAM,MAAA,CAAO,IAAK,CAAA,MAAA,EAAQ,KAAK,KAAK,CAAA,CAAA;AACpD,MAAA,IAAA,GAAO,OAAQ,CAAA,MAAA,CAAO,GAAI,CAAA,CAAC,EAAE,GAAA,EAAK,KAAM,EAAA,KAAO,WAAY,CAAA,EAAE,GAAK,EAAA,KAAA,EAAO,CAAE,CAAA,CAAA;AAC3E,MAAA,QAAA,GAAW,OAAQ,CAAA,IAAA,CAAA;AAAA,KAErB;AACA,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,KAAA,EAAO,KAAK,WAAY,EAAA;AAAA,MACxB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAM,WAAA,CAAY,QAAQ,CAAA,EAAG,KAAO,EAAA,MAAM,WAAY,CAAA,SAAS,CAAE,EAAA;AAAA,KAClF,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,YAAgB,GAAA;AACpB,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,IAAK,CAAA,MAAA,EAAQ,KAAK,KAAK,CAAA,CAAA;AACpD,IAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,MAAO,CAAA,GAAA,CAAI,CAAC,EAAE,GAAK,EAAA,KAAA,EAAa,KAAA,WAAA,CAAY,EAAE,GAAA,EAAK,OAAO,CAAE,CAAE,CAAA,GAAA,CAAI,CAAC,EAAE,GAAK,EAAA,KAAA,QAAa,EAAE,GAAA,EAAK,KAAO,EAAA,EAAE,GAAK,EAAA,GAAA,EAAK,GAAG,KAAA,IAAU,CAAA,CAAA,CAAA;AACnJ,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,KAAA,EAAO,KAAK,WAAY,EAAA;AAAA,MACxB,KAAO,EAAA,MAAM,WAAY,CAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,KACvC,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAe,GAAK,EAAA;AACxB,IAAA,IAAI,IAAK,CAAA,MAAA,IAAU,IAAK,CAAA,MAAA,CAAO,cAAgB,EAAA;AAC7C,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,GAAA,CAAI,IAAI,GAAG,CAAA,CAClC,IAAK,CAAA,CAACC,SAAQA,IAAG,CAAA,CACjB,KAAM,CAAA,OAAO,EAAG,CAAA,CAAA,CAAA;AACnB,MAAA,IAAA,CAAK,MAAO,CAAA,cAAA,CAAe,GAAK,EAAA,MAAA,EAAQ,KAAK,OAAO,CAAA,CAAA;AAAA,KACtD;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,GAAA,CAAK,GAAK,EAAA,IAAA,GAAO,EAAI,EAAA;AACzB,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,IAAS,IAAK,CAAA,KAAA,CAAA;AACjC,IAAM,MAAA,IAAA,GAAO,MAAM,GAAI,CAAA,IAAA,CAAK,QAAQ,KAAO,EAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAC,CAAA,CAAA;AAG/D,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAK,CAAA,MAAA,KAAW,IAAM,EAAA;AACjC,MAAM,MAAA,IAAI,MAAM,WAAW,CAAA,CAAA;AAAA,KAC7B;AACA,IAAA,MAAM,MAAM,IAAK,CAAA,MAAA,CAAA;AACjB,IAAI,IAAA,IAAA,CAAK,SAAS,IAAM,EAAA;AACtB,MAAI,GAAA,CAAA,MAAA,GAAS,KAAK,WAAY,EAAA,CAAA;AAAA,KAChC;AACA,IAAA,GAAA,CAAI,MAAS,GAAA;AAAA,MACX,IAAM,EAAA,MAAM,WAAY,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,MACjC,KAAA,EAAO,KAAK,WAAY,EAAA;AAAA,KAC1B,CAAA;AACA,IAAA,GAAA,CAAI,GAAM,GAAA,GAAA,CAAA;AACV,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,GAAK,CAAA,EAAE,KAAK,MAAQ,EAAA,GAAG,KAAO,EAAA;AAClC,IAAM,MAAA,EAAA,GAAK,GAAO,IAAA,GAAA,GAAM,IAAK,CAAA,MAAA,GAAS,QAAS,CAAA,EAAE,CAAE,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAC1D,IAAA,MAAM,KAAK,aAAc,CAAA,EAAE,KAAK,EAAI,EAAA,GAAG,KAAK,CAAA,CAAA;AAC5C,IAAO,OAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,EAAE,GAAA,EAAK,IAAI,KAAO,EAAA,GAAA,EAAO,EAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAAA,GACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IAAK,OAAS,EAAA;AAClB,IAAI,IAAA,EAAA,CAAA;AACJ,IAAA,IAAI,KAAQ,GAAA,IAAA,CAAA;AACZ,IAAA,IAAI,QAAQ,GAAK,EAAA;AACf,MAAA,EAAA,GAAK,OAAQ,CAAA,GAAA,CAAA;AACb,MAAA,KAAA,GAAQ,OAAQ,CAAA,MAAA,CAAA;AAAA,KACX,MAAA;AACL,MAAK,EAAA,GAAA,OAAA,CAAA;AAAA,KACP;AACA,IAAA,MAAM,KAAK,aAAc,CAAA,EAAE,KAAK,EAAI,EAAA,QAAA,EAAU,MAAM,CAAA,CAAA;AACpD,IAAO,OAAA,MAAM,KAAK,eAAgB,CAAA,EAAE,KAAK,EAAI,EAAA,GAAA,EAAK,IAAK,EAAA,EAAG,KAAK,CAAA,CAAA;AAAA,GAGjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAA,CAAiB,YAAc,EAAA,KAAA,GAAQ,IAAM,EAAA;AACjD,IAAM,MAAA,KAAA,GAAQ,YAAY,YAAY,CAAA,CAAA;AACtC,IAAI,IAAA,KAAA,IAAS,IAAK,CAAA,SAAA,CAAU,KAAK,CAAA,KAAM,KAAK,SAAU,CAAA,IAAA,CAAK,WAAY,EAAC,CAAG,EAAA;AAGzE,MAAM,MAAA,IAAA,GAAO,MAAM,WAAY,CAAA,IAAA,CAAK,QAAQ,IAAK,CAAA,KAAA,EAAO,KAAM,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAC1E,MAAM,MAAA,YAAA,GAAe,IAAK,CAAA,MAAA,CAAO,IAAK,CAAA,CAAC,EAAE,GAAI,EAAA,KAAM,GAAQ,KAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AACpE,MAAA,IAAI,YAAc,EAAA;AAChB,QAAM,MAAA,IAAI,MAAM,+EAA+E,CAAA,CAAA;AAAA,OACjG;AAAA,KACF;AACA,IAAA,MAAM,SAAS,MAAM,aAAA;AAAA,MACnB,iBAAA;AAAA,MACA,IAAK,CAAA,MAAA;AAAA,MACL,OAAO,MAAW,KAAA,MAAM,IAAI,MAAQ,EAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,KACvD,CAAA;AACA,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAQ,OAAA,CAAA,KAAA,CAAM,UAAU,KAAK,CAAA,CAAA;AAC7B,MAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA,CAAA;AAAA,KAClD;AAEA,IAAA,IAAA,CAAK,QAAQ,MAAO,CAAA,IAAA,CAAA;AACpB,IAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,CAAC,YAAY,CAAC,CAAA,CAAA;AACzC,IAAO,OAAA;AAAA,MACL,IAAI,YAAa,CAAA,GAAA;AAAA,MACjB,KAAA,EAAO,KAAK,WAAY,EAAA;AAAA,MACxB,KAAO,EAAA,EAAE,IAAM,EAAA,MAAM,WAAY,CAAA,MAAA,CAAO,IAAI,CAAA,EAAG,KAAO,EAAA,MAAM,WAAY,CAAA,MAAA,CAAO,SAAS,CAAE,EAAA;AAAA,KAC5F,CAAA;AAAA,GAEF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAQ,GAAO,GAAA;AACb,IAAA,OAAO,OAAQ,GAAA,CAAI,IAAK,CAAA,MAAA,EAAQ,KAAK,KAAK,CAAA,CAAA;AAAA,GAC5C;AAAA,EAEA,MAAM,OAAW,GAAA;AACf,IAAA,OAAO,MAAM,aAAA,CAAc,IAAK,CAAA,MAAA,EAAQ,KAAK,KAAK,CAAA,CAAA;AAAA,GACpD;AAAA,EAEA,MAAM,QAAY,GAAA;AAChB,IAAA,OAAO,MAAM,cAAA,CAAe,IAAK,CAAA,MAAA,EAAQ,KAAK,KAAK,CAAA,CAAA;AAAA,GACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAkB,QAAU,EAAA;AAC1B,IAAK,IAAA,CAAA,SAAA,CAAU,IAAI,QAAQ,CAAA,CAAA;AAC3B,IAAA,OAAO,MAAM;AACX,MAAK,IAAA,CAAA,SAAA,CAAU,OAAO,QAAQ,CAAA,CAAA;AAAA,KAChC,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,gBAAiB,OAAS,EAAA;AAE9B,IAAW,KAAA,MAAA,QAAA,IAAY,KAAK,SAAW,EAAA;AACrC,MAAA,MAAM,SAAS,OAAO,CAAA,CAAA;AAAA,KACxB;AAAA,GACF;AAAA,EAEA,eAAgB,aAAe,EAAA;AAG7B,IAAK,IAAA,CAAA,MAAA,CAAO,MAAM,cAAiB,GAAA,aAAA,CAAA;AAAA,GACrC;AAAA,EAEA,qBAAsB,mBAAqB,EAAA;AAEzC,IAAK,IAAA,CAAA,MAAA,CAAO,MAAM,mBAAsB,GAAA,mBAAA,CAAA;AAAA,GAC1C;AACF,CAAA;AAEA,eAAsB,YAAa,IAAM,EAAA;AACvC,EAAI,IAAA,CAAC,IAAQ,IAAA,CAAC,IAAK,CAAA,GAAA;AAAK,IAAA,OAAO,EAAC,CAAA;AAChC,EAAM,MAAA,GAAA,GAAM,MAAM,IAAA,CAAK,GAAI,EAAA,CAAA;AAC3B,EAAO,OAAA,CAAC,GAAG,GAAG,CAAA,CAAE,IAAI,CAAC,GAAA,KAAQ,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAC7C,CAAA;AAEA,SAAS,YAAa,KAAO,EAAA;AAC3B,EAAA,MAAM,UAAa,GAAA,QAAA,CAAS,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC5C,EAAA,OAAO,EAAE,GAAG,KAAO,EAAA,GAAA,EAAK,UAAW,EAAA,CAAA;AACrC,CAAA;AAEA,SAAS,YAAa,KAAO,EAAA;AAC3B,EAAI,IAAA,EAAE,SAAS,KAAM,CAAA,GAAA,CAAA;AAAM,IAAA,OAAA;AAC3B,EAAA,MAAM,UAAa,GAAA,QAAA,CAAS,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC5C,EAAA,OAAO,EAAE,GAAG,KAAO,EAAA,GAAA,EAAK,UAAW,EAAA,CAAA;AACrC;;ACjUA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAG,CAAM,KAAA;AACxB,EAAM,MAAA,CAAC,IAAM,EAAA,IAAI,CAAI,GAAA,CAAA,CAAA;AACrB,EAAM,MAAA,CAAC,IAAM,EAAA,IAAI,CAAI,GAAA,CAAA,CAAA;AACrB,EAAM,MAAA,IAAA,GAAO,aAAc,CAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AACrC,EAAA,IAAI,IAAS,KAAA,CAAA;AAAG,IAAO,OAAA,IAAA,CAAA;AACvB,EAAO,OAAA,UAAA,CAAW,MAAM,IAAI,CAAA,CAAA;AAC9B,CAAA,CAAA;AAEA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAM,IAAS,KAAA;AACjC,EAAI,IAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AAAG,IAAO,OAAA,CAAA,CAAA,CAAA;AAC/B,EAAI,IAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AAAG,IAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA,CAAA;AACxE,EAAA,IAAI,IAAS,KAAA,QAAA;AAAU,IAAO,OAAA,CAAA,CAAA;AAE9B,EAAO,OAAA,aAAA,CAAc,MAAM,IAAI,CAAA,CAAA;AACjC,CAAA,CAAA;AAEA,MAAM,WAAA,GAAc,SAAEV,OAAO,EAAA,OAAA,EAAS,GAAG,CAAC,CAAA,SAAGC,OAAO,UAAAL,MAAA,EAAQ,OAAQ,EAAA,CAAA;AACpE,MAAM,WAAA,GAAc,SAAEI,OAAA,EAAO,OAAS,EAAA,EAAA,CAAG,CAAC,CAAG,SAAAC,OAAA,UAAOL,MAAQ,EAAA,OAAA,EAAS,aAAc,EAAA,CAAA;AAEnF,MAAM,OAAA,GAAU,CAAC,EAAE,GAAK,EAAA,KAAA,QAAa,EAAE,GAAA,EAAK,GAAK,EAAA,GAAG,KAAM,EAAA,CAAA,CAAA;AA6B1D,MAAM,sBAAA,GAAyB,CAAC,OAAA,EAAS,KAAU,KAAA;AACjD,EAAA,MAAM,eAAe,EAAC,CAAA;AACtB,EAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,GAAK,EAAA,KAAA,EAAO,KAAU,KAAA;AACvC,IAAA,IAAI,OAAO,CAAC,KAAA;AAAO,MAAA,OAAA;AACnB,IAAM,KAAA,CAAA,OAAA,CAAQ,EAAE,GAAK,EAAA,KAAA,EAAO,CAAG,EAAA,CAAC,GAAG,CAAM,KAAA;AACvC,MAAA,IAAI,OAAO,CAAA,KAAM,WAAe,IAAA,OAAO,CAAM,KAAA,WAAA;AAAa,QAAA,OAAA;AAC1D,MAAA,YAAA,CAAa,IAAK,CAAA;AAAA,QAChB,KAAK,CAAC,QAAA,CAAS,MAAO,CAAA,CAAC,GAAG,GAAG,CAAA;AAAA,QAC7B,KAAO,EAAA,CAAA;AAAA,OACR,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACD,EAAO,OAAA,YAAA,CAAA;AACT,CAAA,CAAA;AAYO,MAAM,OAAQ,CAAA;AAAA,EACnB,YAAa,QAAU,EAAA,KAAA,EAAO,KAAO,EAAA,IAAA,GAAO,EAAI,EAAA;AAC9C,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAChB,IAAI,IAAA,CAAC,SAAS,WAAa,EAAA;AACzB,MAAS,QAAA,CAAA,WAAA,GAAc,IAAI,qBAAA,CAAsB,QAAS,CAAA,IAAA,GAAO,YAAY,QAAS,CAAA,MAAA,CAAO,KAAM,CAAA,cAAA,EAAgB,CAAA,CAAA;AAAA,KACrH;AAMA,IAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,MAAA,IAAA,CAAK,WAAc,GAAA,KAAA,CAAA;AAAA,KACd,MAAA;AACL,MAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AACb,MAAK,IAAA,CAAA,WAAA,GAAc,MAAM,QAAS,EAAA,CAAA;AAAA,KACpC;AACA,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAK,IAAQ,IAAA,IAAA,CAAK,QAAS,EAAA,CAAA;AACvC,IAAA,IAAA,CAAK,SAAY,GAAA,EAAE,IAAM,EAAA,IAAA,EAAM,KAAK,IAAK,EAAA,CAAA;AACzC,IAAA,IAAA,CAAK,UAAa,GAAA,EAAE,IAAM,EAAA,IAAA,EAAM,KAAK,IAAK,EAAA,CAAA;AAC1C,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AACd,IAAA,IAAI,KAAO,EAAA;AACT,MAAK,IAAA,CAAA,SAAA,CAAU,MAAM,KAAM,CAAA,IAAA,CAAA;AAC3B,MAAK,IAAA,CAAA,UAAA,CAAW,MAAM,KAAM,CAAA,KAAA,CAAA;AAC5B,MAAA,IAAA,CAAK,SAAS,KAAM,CAAA,EAAA,CAAA;AAAA,KACtB;AACA,IAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAK,QAAS,CAAA,UAAA,GAAa,CAAY,SAAA,EAAA,IAAA,CAAK,MAAO,EAAA,CAAE,QAAS,CAAA,EAAE,CAAE,CAAA,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA;AAClG,IAAA,IAAA,CAAK,kBAAqB,GAAA,IAAA,CAAA;AAC1B,IAAI,IAAA,CAAC,KAAK,SAAW,EAAA;AAAE,MAAQ,OAAA,CAAA,oBAAA,CAAqB,IAAM,EAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,KAAE;AAAA,GAC3E;AAAA,EAEA,QAAY,GAAA;AACV,IAAA,MAAM,KAAQ,GAAA,iDAAA,CAAA;AACd,IAAA,MAAM,OAAU,GAAA,KAAA,CAAM,IAAK,CAAA,IAAA,CAAK,WAAY,CAAA,QAAA,CAAS,KAAK,CAAA,EAAG,CAAS,KAAA,KAAA,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAA;AACrF,IAAA,OAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,GAClB;AAAA,EAEA,OAAO,oBAAsB,CAAA,OAAA,EAAS,QAAU,EAAA;AAC9C,IAAA,IAAI,CAAC,QAAS,CAAA,OAAA,CAAQ,GAAI,CAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AAC9C,MAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,OAAQ,CAAA,WAAA,EAAa,OAAO,CAAA,CAAA;AAAA,KAC5C,MAAA;AAEL,MAAA,MAAM,aAAgB,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,QAAQ,WAAW,CAAA,CAAA;AAE9D,MAAA,IAAI,cAAc,KAAO,EAAA;AACvB,QAAA,aAAA,CAAc,SAAS,OAAQ,CAAA,MAAA,CAAA;AAC/B,QAAc,aAAA,CAAA,SAAA,CAAU,GAAM,GAAA,OAAA,CAAQ,SAAU,CAAA,GAAA,CAAA;AAChD,QAAc,aAAA,CAAA,UAAA,CAAW,GAAM,GAAA,OAAA,CAAQ,UAAW,CAAA,GAAA,CAAA;AAAA,OAC7C,MAAA;AACL,QAAA,OAAA,CAAQ,SAAS,aAAc,CAAA,MAAA,CAAA;AAC/B,QAAQ,OAAA,CAAA,SAAA,CAAU,GAAM,GAAA,aAAA,CAAc,SAAU,CAAA,GAAA,CAAA;AAChD,QAAQ,OAAA,CAAA,UAAA,CAAW,GAAM,GAAA,aAAA,CAAc,UAAW,CAAA,GAAA,CAAA;AAClD,QAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,OAAQ,CAAA,WAAA,EAAa,OAAO,CAAA,CAAA;AAAA,OACnD;AAAA,KACF;AAAA,GACF;AAAA,EAEA,MAAU,GAAA;AACR,IAAA,MAAM,YAAY,EAAE,IAAA,EAAM,IAAK,CAAA,IAAA,EAAM,MAAM,IAAK,CAAA,WAAA,EAAa,KAAO,EAAA,EAAE,IAAI,IAAM,EAAA,IAAA,EAAM,IAAM,EAAA,KAAA,EAAO,MAAO,EAAA,CAAA;AAC1G,IAAU,SAAA,CAAA,KAAA,CAAM,KAAK,IAAK,CAAA,MAAA,EAAQ,IAAI,CAAO,GAAA,KAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAC3D,IAAA,SAAA,CAAU,KAAM,CAAA,IAAA,GAAO,IAAK,CAAA,SAAA,CAAU,KAAK,QAAS,EAAA,CAAA;AACpD,IAAA,SAAA,CAAU,KAAM,CAAA,KAAA,GAAQ,IAAK,CAAA,UAAA,CAAW,KAAK,QAAS,EAAA,CAAA;AACtD,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAO,QAAU,CAAA,QAAA,EAAU,EAAE,IAAM,EAAA,KAAA,EAAO,MAAQ,EAAA;AAEhD,IAAA,OAAO,IAAI,OAAQ,CAAA,QAAA,EAAU,MAAM,KAAO,EAAA,EAAE,MAAM,CAAA,CAAA;AAAA,GACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,KAAA,CAAO,KAAO,EAAA,MAAA,GAAS,IAAM,EAAA;AAIjC,IAAA,MAAA,IAAU,MAAM,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,SAAS,WAAW,CAAA,CAAA;AAI1D,IAAM,MAAA,QAAA,GAAW,MAAM,YAAa,CAAA,IAAA,CAAK,SAAS,WAAa,EAAA,IAAA,CAAK,YAAY,KAAK,CAAA,CAAA;AAErF,IAAO,OAAA;AAAA,MACL,OAAO,EAAE,KAAA,EAAO,MAAM,WAAY,CAAA,QAAA,CAAS,IAAI,CAAE,EAAA;AAAA,MACjD,IAAA,EAAM,SAAS,MAAO,CAAA,GAAA,CAAI,CAAC,EAAE,EAAA,EAAI,GAAK,EAAA,GAAA,EAAU,KAAA;AAC9C,QAAQ,OAAA,EAAE,IAAI,GAAK,EAAA,QAAA,CAAS,OAAO,GAAG,CAAA,EAAG,OAAO,GAAI,EAAA,CAAA;AAAA,OACrD,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAa,MAAQ,EAAA;AAGzB,IAAA,IAAI,IAAK,CAAA,kBAAA;AAAoB,MAAA,OAAO,IAAK,CAAA,kBAAA,CAAA;AACzC,IAAK,IAAA,CAAA,kBAAA,GAAqB,IAAK,CAAA,gBAAA,CAAiB,MAAM,CAAA,CAAA;AACtD,IAAK,IAAA,CAAA,kBAAA,CAAmB,QAAQ,MAAM;AAAE,MAAA,IAAA,CAAK,kBAAqB,GAAA,IAAA,CAAA;AAAA,KAAM,CAAA,CAAA;AACxE,IAAA,OAAO,IAAK,CAAA,kBAAA,CAAA;AAAA,GACd;AAAA,EAEA,MAAM,iBAAkB,QAAU,EAAA;AAWhC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAS,CAAA,YAAA,CAAa,KAAK,MAAM,CAAA,CAAA;AAO3D,IAAI,IAAA,MAAA,CAAO,IAAK,CAAA,MAAA,KAAW,CAAG,EAAA;AAE5B,MAAA,IAAA,CAAK,SAAS,MAAO,CAAA,KAAA,CAAA;AACrB,MAAA,OAAA;AAAA,KACF;AACA,IAAA,MAAM,aAAc,CAAA,aAAA,EAAe,QAAU,EAAA,OAAO,MAAW,KAAA;AAC7D,MAAA,IAAI,kBAAkB,EAAC,CAAA;AACvB,MAAA,IAAI,yBAAyB,EAAC,CAAA;AAC9B,MAAA,MAAM,SAAU,CAAA,MAAA,EAAQ,IAAK,CAAA,SAAA,EAAW,WAAW,CAAA,CAAA;AACnD,MAAA,MAAM,SAAU,CAAA,MAAA,EAAQ,IAAK,CAAA,UAAA,EAAY,WAAW,CAAA,CAAA;AACpD,MAAA,IAAI,KAAK,MAAQ,EAAA;AACf,QAAA,MAAM,gBAAmB,GAAA,MAAM,IAAK,CAAA,SAAA,CAAU,KAAK,OAAQ,CAAA,MAAA,CAAO,IAAK,CAAA,GAAA,CAAI,CAAC,EAAE,GAAI,EAAA,KAAM,GAAG,CAAC,CAAA,CAAA;AAC5F,QAAkB,eAAA,GAAA,gBAAA,CAAiB,OAAO,GAAI,CAAA,CAAC,SAAS,EAAE,GAAA,EAAK,GAAK,EAAA,IAAA,EAAO,CAAA,CAAA,CAAA;AAC3E,QAAA,sBAAA,GAAyB,eAAgB,CAAA,GAAA,CAAI,CAAC,EAAE,GAAI,EAAA,MAAO,EAAE,GAAA,EAAK,GAAI,CAAA,CAAC,CAAG,EAAA,GAAA,EAAK,MAAO,CAAA,CAAA,CAAA;AAAA,OACxF;AACA,MAAI,IAAA,CAAC,KAAK,KAAO,EAAA;AACf,QAAM,MAAA,IAAI,MAAM,mHAAuH,IAAA,IAAA,CAAK,cAAc,2DAA8D,GAAA,IAAA,CAAK,cAAc,EAAG,CAAA,CAAA,CAAA;AAAA,OAChP;AACA,MAAA,MAAM,YAAe,GAAA,sBAAA,CAAuB,MAAO,CAAA,IAAA,EAAM,KAAK,KAAK,CAAA,CAAA;AACnE,MAAA,MAAM,gBAAmB,GAAA,YAAA,CAAa,GAAI,CAAA,CAAC,EAAE,GAAI,EAAA,MAAO,EAAE,GAAA,EAAK,GAAI,CAAA,CAAC,CAAG,EAAA,KAAA,EAAO,KAAM,CAAA,CAAA,CAAA;AACpF,MAAK,IAAA,CAAA,SAAA,GAAY,MAAM,SAAA,CAAU,MAAQ,EAAA,IAAA,CAAK,WAAW,sBAAuB,CAAA,MAAA,CAAO,gBAAgB,CAAA,EAAG,WAAW,CAAA,CAAA;AACrH,MAAK,IAAA,CAAA,UAAA,GAAa,MAAM,SAAA,CAAU,MAAQ,EAAA,IAAA,CAAK,YAAY,eAAgB,CAAA,MAAA,CAAO,YAAY,CAAA,EAAG,WAAW,CAAA,CAAA;AAC5G,MAAA,IAAA,CAAK,SAAS,MAAO,CAAA,KAAA,CAAA;AAAA,KACtB,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,QAAA,CAAS,eAAe,SAAS,CAAA,CAAA;AAAA,GAGxC;AACF,CAAA;AASA,eAAe,SAAW,CAAA,MAAA,EAAQ,OAAS,EAAA,YAAA,EAAc,IAAM,EAAA;AAC7D,EAAA,IAAI,CAAC,YAAa,CAAA,MAAA;AAAQ,IAAO,OAAA,OAAA,CAAA;AACjC,EAAA,MAAM,QAAW,GAAA,MAAA,CAAO,GAAI,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AACvC,EAAA,MAAM,EAAE,QAAA,EAAa,GAAA,YAAA,CAAa,MAAM,CAAA,CAAA;AACxC,EAAI,IAAA,eAAA,CAAA;AACJ,EAAI,IAAA,UAAA,CAAA;AACJ,EAAI,IAAA,CAAC,QAAQ,IAAM,EAAA;AACjB,IAAA,MAAM,MAAM,OAAQ,CAAA,GAAA,CAAA;AACpB,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAiB,WAAA,MAAA,IAAA,IAAQ,MAAMY,QAAA,CAAO,EAAE,GAAA,EAAK,QAAU,EAAA,IAAA,EAAM,YAAc,EAAA,GAAG,IAAK,EAAC,CAAG,EAAA;AACrF,QAAM,MAAA,KAAA,GAAQ,MAAM,IAAK,CAAA,KAAA,CAAA;AACzB,QAAA,MAAM,QAAS,CAAA,KAAA,CAAM,GAAK,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACrC,QAAkB,eAAA,GAAA,KAAA,CAAA;AAClB,QAAa,UAAA,GAAA,IAAA,CAAA;AAAA,OACf;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,UAAY,EAAA,GAAA,EAAK,gBAAgB,GAAI,EAAA,CAAA;AAAA,KACtD;AACA,IAAQ,OAAA,CAAA,IAAA,GAAO,MAAMD,MAAK,CAAA,EAAE,KAAK,GAAK,EAAA,QAAA,EAAU,GAAG,WAAA,EAAa,CAAA,CAAA;AAAA,GAClE;AACA,EAAM,MAAA,EAAE,MAAM,MAAQ,EAAA,SAAA,KAAc,MAAM,OAAA,CAAQ,IAAK,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AACxE,EAAA,eAAA,GAAkB,MAAM,IAAK,CAAA,KAAA,CAAA;AAC7B,EAAa,UAAA,GAAA,IAAA,CAAA;AACb,EAAA,WAAA,MAAiB,SAAS,SAAW,EAAA;AACnC,IAAA,MAAM,QAAS,CAAA,KAAA,CAAM,GAAK,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,GACvC;AACA,EAAA,MAAM,QAAS,CAAA,eAAA,CAAgB,GAAK,EAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACzD,EAAA,OAAO,EAAE,IAAA,EAAM,UAAY,EAAA,GAAA,EAAK,gBAAgB,GAAI,EAAA,CAAA;AACtD,CAAA;AAEA,eAAe,SAAA,CAAW,MAAQ,EAAA,KAAA,EAAO,SAAW,EAAA;AAClD,EAAI,IAAA,CAAC,MAAM,IAAM,EAAA;AACf,IAAA,MAAM,MAAM,KAAM,CAAA,GAAA,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA;AAAK,MAAA,OAAA;AACV,IAAA,MAAM,EAAE,QAAA,EAAa,GAAA,YAAA,CAAa,MAAM,CAAA,CAAA;AACxC,IAAM,KAAA,CAAA,IAAA,GAAO,MAAMA,MAAK,CAAA,EAAE,KAAK,GAAK,EAAA,QAAA,EAAU,GAAG,SAAA,EAAW,CAAA,CAAA;AAAA,GAC9D;AACA,EAAA,OAAO,KAAM,CAAA,IAAA,CAAA;AACf,CAAA;AAEA,eAAe,UAAA,CAAY,SAAS,KAAO,EAAA;AACzC,EAAA,OAAA,CAAQ,MAAS,GAAA,OAAA,CAAQ,MAAO,CAAA,KAAA,CAAM,GAAG,KAAK,CAAA,CAAA;AAC9C,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AAEA,eAAe,YAAc,CAAA,MAAA,EAAQ,UAAY,EAAA,KAAA,GAAQ,EAAI,EAAA;AAC3D,EAAM,MAAA,SAAA,CAAU,MAAQ,EAAA,UAAA,EAAY,WAAW,CAAA,CAAA;AAC/C,EAAA,IAAI,CAAC,UAAW,CAAA,IAAA;AAAM,IAAO,OAAA,EAAE,MAAQ,EAAA,EAAG,EAAA,CAAA;AAC1C,EAAA,IAAI,MAAM,KAAO,EAAA;AACf,IAAM,MAAA,YAAA,GAAe,MAAM,KAAM,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAC,CAAA,CAAA;AAClE,IAAO,OAAA,UAAA,CAAW,MAAM,UAAW,CAAA,IAAA,CAAK,MAAM,GAAG,YAAY,CAAG,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,GAC7E,MAAA,IAAW,MAAM,GAAK,EAAA;AACpB,IAAA,MAAM,UAAa,GAAA,QAAA,CAAS,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC5C,IAAO,OAAA,UAAA,CAAW,IAAK,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAAA,GAChC,MAAA;AACL,IAAM,MAAA,EAAE,QAAQ,GAAG,GAAA,KAAQ,MAAM,UAAA,CAAW,KAAK,aAAc,EAAA,CAAA;AAC/D,IAAO,OAAA,UAAA,CAAW,EAAE,MAAA,EAAQ,MAAO,CAAA,GAAA,CAAI,CAAC,EAAE,GAAK,EAAA,CAAC,CAAG,EAAA,EAAE,CAAG,EAAA,KAAA,QAAa,EAAE,GAAA,EAAK,CAAG,EAAA,EAAA,EAAI,GAAK,EAAA,KAAA,EAAQ,CAAA,CAAA,EAAG,GAAG,GAAA,EAAO,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,GAC1H;AACF;;ACxTO,MAAM,QAAS,CAAA;AAAA,EACpB,UAAA,uBAAiB,GAAI,EAAA,CAAA;AAAA,EACrB,eAAkB,GAAA,IAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,WAAA,CAAa,UAAU,SAAW,EAAA;AAChC,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAChB,IAAK,IAAA,CAAA,eAAA,GAAkB,SAAS,gBAAiB,CAAA,CAAoB,YAAY,IAAK,CAAA,SAAA,CAAU,OAAO,CAAC,CAAA,CAAA;AAKxG,IAAA,IAAA,CAAK,SACH,GAAA,SAAA,IACA,SAA6B,CAAA,EAAyC,IAAM,EAAA;AAC1E,MAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAAA,KACV,CAAA;AACF,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AAAA,GAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,EAAA,CAAI,KAAO,EAAA,UAAA,EAAY,KAAO,EAAA;AAC5B,IAAA,MAAM,sBAAyB,GAAA,YAAA,CAAa,IAAK,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAClE,IAAA,sBAAA,CAAuB,KAAK,UAAU,CAAA,CAAA;AACtC,IAAI,IAAA,OAAO,UAAU,WAAa,EAAA;AAChC,MAAK,IAAA,CAAA,QAAA,CAAS,aAAa,KAAK,CAAA,CAAE,KAAK,CAAC,EAAE,IAAM,EAAA,OAAA,EAAc,KAAA;AAC5D,QAAA,MAAM,OAAO,gBAAiB,CAAA,OAAA,EAAS,KAAK,SAAS,CAAA,CAAE,IAAI,KAAK,CAAA,CAAA;AAChE,QAAI,IAAA,IAAA;AAAM,UAAA,IAAA,CAAK,OAAQ,CAAA,CAAoB,GAAQ,KAAA,UAAA,CAAW,GAAG,CAAC,CAAA,CAAA;AAAA,OACnE,CAAA,CAAA;AAAA,KACH;AACA,IAAA,OAAO,MAAM;AACX,MAAM,MAAA,KAAA,GAAQ,sBAAuB,CAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AACvD,MAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AAAI,QAAuB,sBAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAAA,KACxD,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAW,OAAS,EAAA;AAClB,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,OAAO,CAAG,EAAA;AAC1B,MAAA,MAAM,UAAa,GAAA,gBAAA,CAAiB,OAAS,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAC3D,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,CAAA,IAAK,UAAY,EAAA;AACtC,QAAA,MAAM,sBAAyB,GAAA,YAAA,CAAa,IAAK,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAClE,QAAuB,sBAAA,CAAA,OAAA;AAAA,UAAQ,CAAmC,eAChE,IAAK,CAAA,OAAA,CAAQ,CAAoB,GAAQ,KAAA,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,SAC1D,CAAA;AAAA,OACF;AAAA,KACK,MAAA;AAEL,MAAA,KAAA,MAAW,GAAG,sBAAsB,CAAA,IAAK,KAAK,UAAY,EAAA;AACxD,QAAA,sBAAA,CAAuB,OAAQ,CAAA,CAAmC,UAAe,KAAA,UAAA,CAAW,OAAO,CAAC,CAAA,CAAA;AAAA,OACtG;AAAA,KACF;AAAA,GACF;AACF,CAAA;AAMA,SAAS,YAAA,CAAc,gBAAgB,IAAM,EAAA;AAC3C,EAAI,IAAA,SAAA,GAAY,cAAe,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AACvC,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAA,SAAA,GAAY,EAAC,CAAA;AACb,IAAe,cAAA,CAAA,GAAA,CAAI,MAAM,SAAS,CAAA,CAAA;AAAA,GACpC;AACA,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAUA,MAAM,gBAAA,GAAmB,CAAC,OAAA,EAAS,SAAc,KAAA;AAC/C,EAAM,MAAA,UAAA,uBAAiB,GAAI,EAAA,CAAA;AAC3B,EAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,GAAK,EAAA,KAAA,EAAO,KAAU,KAAA;AACvC,IAAA,IAAI,OAAO,CAAC,KAAA;AAAO,MAAQ,KAAA,GAAA,EAAE,UAAU,IAAK,EAAA,CAAA;AAC5C,IAAA,SAAA,CAAU,EAAE,GAAK,EAAA,GAAA,EAAK,GAAG,KAAM,EAAA,EAAG,CAAoB,CAAM,KAAA;AAC1D,MAAM,MAAA,SAAA,GAAY,YAAa,CAAA,UAAA,EAAY,CAAC,CAAA,CAAA;AAC5C,MAAA,SAAA,CAAU,KAAK,GAAG,CAAA,CAAA;AAAA,KACnB,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACD,EAAO,OAAA,UAAA,CAAA;AACT,CAAA;;AC9GA,MAAM,QAAA,GAAW,SAAO,OAAO,GAAA,KAAQ,WAAW,GAAI,CAAA,KAAA,CAAM,GAAG,CAAI,GAAA,GAAA,CAAA;AAE5D,MAAM,QAAS,CAAA;AAAA,EACpB,OAAO,QAAU,CAAA,IAAA,EAAM,QAAU,EAAA;AAC/B,IAAA,QAAA,CAAS,QAAQ,EAAE,KAAA,EAAO,IAAK,CAAA,KAAA,CAAM,IAAI,CAAK,CAAA,KAAA,QAAA,CAAS,CAAC,CAAC,GAAG,IAAM,EAAA,IAAA,CAAK,MAAM,GAAK,EAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAC5F,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAW,KAAA,MAAA,EAAE,IAAM,EAAA,IAAA,EAAM,KAAO,EAAA,EAAE,IAAM,EAAA,KAAA,EAAO,EAAG,EAAA,EAAO,IAAA,IAAA,CAAK,OAAS,EAAA;AACrE,QAAA,OAAA,CAAQ,SAAS,QAAU,EAAA;AAAA,UACzB,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,IAAA,GAAO,QAAS,CAAA,IAAI,CAAI,GAAA,IAAA;AAAA,YAC9B,KAAO,EAAA,KAAA,GAAQ,QAAS,CAAA,KAAK,CAAI,GAAA,IAAA;AAAA,YACjC,EAAA,EAAI,KAAK,EAAG,CAAA,GAAA,CAAI,OAAK,QAAS,CAAA,CAAC,CAAC,CAAI,GAAA,IAAA;AAAA,WACtC;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AACA,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAO,QAAU,CAAA,QAAA,EAAU,KAAO,EAAA;AAChC,IAAM,MAAA,UAAA,GAAa,SAAS,MAAO,EAAA,CAAA;AACnC,IAAA,MAAM,UAAa,GAAA,IAAI,SAAU,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAChD,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,UAAA,CAAW,QAAQ,KAAM,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AAC7C,MAAW,UAAA,CAAA,OAAA,CAAQ,QAAQ,CAAS,KAAA,KAAA;AAClC,QAAA,KAAA,CAAM,MAAM,IAAO,GAAA,IAAA,CAAA;AACnB,QAAA,KAAA,CAAM,MAAM,KAAQ,GAAA,IAAA,CAAA;AACpB,QAAA,KAAA,CAAM,MAAM,EAAK,GAAA,IAAA,CAAA;AAAA,OAClB,CAAA,CAAA;AAAA,KACH;AACA,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,QAAS,CAAA,UAAA,EAAY,UAAU,CAAA,CAAA;AACrD,IAAC,CAAC,GAAG,QAAS,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAG,QAAQ,CAAS,KAAA,KAAA;AACjD,MAAA,SAAA,CAAU,QAAQ,GAAI,CAAA,KAAA,CAAM,WAAW,CAAA,CAAE,QAAQ,KAAM,CAAA,KAAA,CAAA;AAAA,KACxD,CAAA,CAAA;AACD,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AAAA,EAEA,aAAa,IAAM,CAAA,QAAA,EAAU,KAAO,EAAA;AACjC,IAAC,CAAC,GAAG,QAAS,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAG,QAAQ,CAAS,KAAA,KAAA;AACjD,MAAA,KAAA,CAAM,SAAY,GAAA,EAAE,IAAM,EAAA,IAAA,EAAM,KAAK,IAAK,EAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,UAAa,GAAA,EAAE,IAAM,EAAA,IAAA,EAAM,KAAK,IAAK,EAAA,CAAA;AAC3C,MAAA,KAAA,CAAM,MAAS,GAAA,IAAA,CAAA;AAAA,KAChB,CAAA,CAAA;AACD,IAAA,QAAA,CAAS,QAAQ,KAAM,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AAC3C,IAAA,MAAM,SAAS,WAAY,EAAA,CAAA;AAC3B,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AACF;;;;"}
@@ -0,0 +1,135 @@
1
+ /* global localStorage */
2
+ // @ts-ignore
3
+ import { useEffect, useState, createContext } from 'react'
4
+ import { Fireproof, Listener, Hydrator } from '../src/index'
5
+
6
+ // export interface FireproofCtxValue {
7
+ // addSubscriber: (label: String, fn: Function) => void
8
+ // database: Fireproof
9
+ // ready: boolean
10
+ // persist: () => void
11
+ // }
12
+ export const FireproofCtx = createContext({
13
+ addSubscriber: () => {},
14
+ database: null,
15
+ ready: false
16
+ })
17
+
18
+ const inboundSubscriberQueue = new Map()
19
+
20
+ let startedSetup = false
21
+ let database
22
+ let listener
23
+ const initializeDatabase = name => {
24
+ if (database) return
25
+ database = Fireproof.storage(name)
26
+ listener = new Listener(database)
27
+ }
28
+
29
+ /**
30
+ * @function useFireproof
31
+ * React hook to initialize a Fireproof database, automatically saving and loading the clock.
32
+ * You might need to `import { nodePolyfills } from 'vite-plugin-node-polyfills'` in your vite.config.ts
33
+ * @param [defineDatabaseFn] Synchronous function that defines the database, run this before any async calls
34
+ * @param [setupDatabaseFn] Asynchronous function that sets up the database, run this to load fixture data etc
35
+ * @returns {FireproofCtxValue} { addSubscriber, database, ready }
36
+ */
37
+ export function useFireproof (
38
+ defineDatabaseFn = () => {},
39
+ setupDatabaseFn = async () => {},
40
+ name
41
+ ) {
42
+ const [ready, setReady] = useState(false)
43
+ initializeDatabase(name || 'useFireproof')
44
+ const localStorageKey = 'fp.' + database.name
45
+
46
+ const addSubscriber = (label, fn) => {
47
+ inboundSubscriberQueue.set(label, fn)
48
+ }
49
+
50
+ const listenerCallback = async event => {
51
+ localSet(localStorageKey, JSON.stringify(database))
52
+ if (event._external) return
53
+ for (const [, fn] of inboundSubscriberQueue) fn()
54
+ }
55
+
56
+ useEffect(() => {
57
+ const doSetup = async () => {
58
+ if (ready) return
59
+ if (startedSetup) return
60
+ startedSetup = true
61
+ defineDatabaseFn(database) // define indexes before querying them
62
+ console.log('Initializing database', database.name)
63
+ const fp = localGet(localStorageKey) // todo use db.name
64
+ if (fp) {
65
+ try {
66
+ const serialized = JSON.parse(fp)
67
+ // console.log('serialized', JSON.stringify(serialized.indexes.map(c => c.clock)))
68
+ console.log(`Loading previous database clock. (localStorage.removeItem('${localStorageKey}') to reset)`)
69
+ await Hydrator.fromJSON(serialized, database)
70
+ const changes = await database.changesSince()
71
+ if (changes.rows.length < 2) {
72
+ // console.log('Resetting database')
73
+ throw new Error('Resetting database')
74
+ }
75
+ } catch (e) {
76
+ console.error(`Error loading previous database clock. ${fp} Resetting.`, e)
77
+ await Hydrator.zoom(database, [])
78
+ await setupDatabaseFn(database)
79
+ localSet(localStorageKey, JSON.stringify(database))
80
+ }
81
+ } else {
82
+ await setupDatabaseFn(database)
83
+ localSet(localStorageKey, JSON.stringify(database))
84
+ }
85
+ setReady(true)
86
+ listener.on('*', listenerCallback)// hushed('*', listenerCallback, 250))
87
+ }
88
+ doSetup()
89
+ }, [ready])
90
+
91
+ return {
92
+ addSubscriber,
93
+ database,
94
+ ready,
95
+ persist: () => {
96
+ localSet(localStorageKey, JSON.stringify(database))
97
+ }
98
+ }
99
+ }
100
+
101
+ // const husherMap = new Map()
102
+ // const husher = (id, workFn, ms) => {
103
+ // if (!husherMap.has(id)) {
104
+ // const start = Date.now()
105
+ // husherMap.set(
106
+ // id,
107
+ // workFn().finally(() => setTimeout(() => husherMap.delete(id), ms - (Date.now() - start)))
108
+ // )
109
+ // }
110
+ // return husherMap.get(id)
111
+ // }
112
+ // const hushed =
113
+ // (id, workFn, ms) =>
114
+ // (...args) =>
115
+ // husher(id, () => workFn(...args), ms)
116
+
117
+ let storageSupported = false
118
+ try {
119
+ storageSupported = window.localStorage && true
120
+ } catch (e) {}
121
+ export function localGet (key) {
122
+ if (storageSupported) {
123
+ return localStorage && localStorage.getItem(key)
124
+ }
125
+ }
126
+ function localSet (key, value) {
127
+ if (storageSupported) {
128
+ return localStorage && localStorage.setItem(key, value)
129
+ }
130
+ }
131
+ // function localRemove(key) {
132
+ // if (storageSupported) {
133
+ // return localStorage && localStorage.removeItem(key)
134
+ // }
135
+ // }
package/package.json CHANGED
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "name": "@fireproof/core",
3
- "version": "0.3.13",
3
+ "version": "0.3.14",
4
4
  "description": "Realtime database for IPFS",
5
- "main": "src/index.js",
5
+ "main": "dist/src/index.js",
6
+ "module": "dist/fireproof.mjs",
7
+ "typings": "dist/fireproof.d.ts",
6
8
  "type": "module",
7
9
  "types": "./dist/src/index.d.ts",
8
10
  "scripts": {
@@ -16,7 +18,9 @@
16
18
  "postpublish": "rm README.md",
17
19
  "lint": "standard",
18
20
  "lint:fix": "standard --fix",
19
- "build": "tsc --build"
21
+ "tbuild": "tsc --build",
22
+ "build": "rollup -c"
23
+
20
24
  },
21
25
  "keywords": [
22
26
  "database",
@@ -50,10 +54,14 @@
50
54
  },
51
55
  "devDependencies": {
52
56
  "c8": "^7.12.0",
57
+ "esbuild": "^0.17.16",
53
58
  "fake-indexeddb": "^4.0.1",
54
59
  "flexsearch": "^0.7.31",
55
60
  "mocha": "^10.2.0",
56
61
  "nanoid": "^4.0.0",
62
+ "rollup": "^3.20.2",
63
+ "rollup-plugin-dts": "^5.3.0",
64
+ "rollup-plugin-esbuild": "^5.0.0",
57
65
  "standard": "^17.0.0",
58
66
  "typescript": "^5.0.2",
59
67
  "webpack": "^5.78.0",
@@ -100,11 +108,16 @@
100
108
  "types": "./dist/src/db-index.d.ts",
101
109
  "import": "./src/db-index.js"
102
110
  },
111
+ "./use-fireproof": {
112
+ "types": "./dist/hooks/use-fireproof.d.ts",
113
+ "import": "./hooks/use-fireproof.js"
114
+ },
103
115
  "./package.json": "./package.json"
104
116
  },
105
117
  "files": [
106
118
  "src",
107
- "dist",
119
+ "dist",
120
+ "hooks",
108
121
  "README.md"
109
122
  ],
110
123
  "workspaces": [
package/src/blockstore.js CHANGED
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  import { parse } from 'multiformats/link'
3
2
  import { CID } from 'multiformats'
4
3
  import { Valet } from './valet.js'
@@ -16,6 +15,10 @@ const husher = (id, workFn) => {
16
15
  return husherMap.get(id)
17
16
  }
18
17
 
18
+ /**
19
+ * @typedef {{ get: (link: import('../src/link').AnyLink) => Promise<AnyBlock | undefined> }} BlockFetcher
20
+ */
21
+
19
22
  /**
20
23
  * @typedef {Object} AnyBlock
21
24
  * @property {import('./link').AnyLink} cid - The CID of the block
@@ -26,8 +29,7 @@ const husher = (id, workFn) => {
26
29
  * @property {function(import('./link').AnyLink, Uint8Array): Promise<void>} put - A function to store a block's data and CID
27
30
  *
28
31
  * A blockstore that caches writes to a transaction and only persists them when committed.
29
- * @implements {Blockstore}
30
- */
32
+ */
31
33
  export class TransactionBlockstore {
32
34
  /** @type {Map<string, Uint8Array>} */
33
35
  committedBlocks = new Map()
@@ -190,21 +192,24 @@ export class TransactionBlockstore {
190
192
  * @memberof TransactionBlockstore
191
193
  */
192
194
  export const doTransaction = async (label, blockstore, doFun) => {
195
+ // @ts-ignore
193
196
  if (!blockstore.commit) return await doFun(blockstore)
197
+ // @ts-ignore
194
198
  const innerBlockstore = blockstore.begin(label)
195
199
  try {
196
200
  const result = await doFun(innerBlockstore)
201
+ // @ts-ignore
197
202
  await blockstore.commit(innerBlockstore)
198
203
  return result
199
204
  } catch (e) {
200
205
  console.error(`Transaction ${label} failed`, e, e.stack)
201
206
  throw e
202
207
  } finally {
208
+ // @ts-ignore
203
209
  blockstore.retire(innerBlockstore)
204
210
  }
205
211
  }
206
212
 
207
- /** @implements {BlockFetcher} */
208
213
  export class InnerBlockstore {
209
214
  /** @type {Map<string, Uint8Array>} */
210
215
  blocks = new Map()
@@ -237,7 +242,7 @@ export class InnerBlockstore {
237
242
  * @param {import('./link').AnyLink} cid
238
243
  * @param {Uint8Array} bytes
239
244
  */
240
- put (cid, bytes) {
245
+ async put (cid, bytes) {
241
246
  // console.log('put', cid)
242
247
  this.blocks.set(cid.toString(), bytes)
243
248
  this.lastCid = cid