@fairfox/polly 0.50.0 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/src/mesh.js
CHANGED
|
@@ -1847,6 +1847,92 @@ function $meshList(key, initialValue, options = {}) {
|
|
|
1847
1847
|
import {
|
|
1848
1848
|
NetworkAdapter as NetworkAdapter2
|
|
1849
1849
|
} from "@automerge/automerge-repo/slim";
|
|
1850
|
+
|
|
1851
|
+
// src/shared/lib/sync-fragment.ts
|
|
1852
|
+
var SYNC_FRAGMENT_THRESHOLD = 64 * 1024;
|
|
1853
|
+
var SYNC_FRAGMENT_CHUNK_SIZE = 64 * 1024;
|
|
1854
|
+
function serialiseSyncFragment(header, data) {
|
|
1855
|
+
const headerBytes = new TextEncoder().encode(JSON.stringify(header));
|
|
1856
|
+
const size = 4 + headerBytes.length + data.length;
|
|
1857
|
+
const buffer = new ArrayBuffer(size);
|
|
1858
|
+
const out = new Uint8Array(buffer);
|
|
1859
|
+
const view = new DataView(buffer);
|
|
1860
|
+
view.setUint32(0, headerBytes.length, false);
|
|
1861
|
+
out.set(headerBytes, 4);
|
|
1862
|
+
out.set(data, 4 + headerBytes.length);
|
|
1863
|
+
return out;
|
|
1864
|
+
}
|
|
1865
|
+
function parseSyncFragment(bytes) {
|
|
1866
|
+
if (bytes.length < 4)
|
|
1867
|
+
return;
|
|
1868
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
1869
|
+
const headerLen = view.getUint32(0, false);
|
|
1870
|
+
if (bytes.length < 4 + headerLen)
|
|
1871
|
+
return;
|
|
1872
|
+
try {
|
|
1873
|
+
const header = JSON.parse(new TextDecoder().decode(bytes.subarray(4, 4 + headerLen)));
|
|
1874
|
+
if (header.type !== "sync-fragment")
|
|
1875
|
+
return;
|
|
1876
|
+
const data = bytes.subarray(4 + headerLen);
|
|
1877
|
+
return { header, data };
|
|
1878
|
+
} catch {
|
|
1879
|
+
return;
|
|
1880
|
+
}
|
|
1881
|
+
}
|
|
1882
|
+
function isSyncFragmentType(bytes) {
|
|
1883
|
+
if (bytes.length < 4)
|
|
1884
|
+
return false;
|
|
1885
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
1886
|
+
const headerLen = view.getUint32(0, false);
|
|
1887
|
+
if (bytes.length < 4 + headerLen)
|
|
1888
|
+
return false;
|
|
1889
|
+
const headerSlice = bytes.subarray(4, 4 + headerLen);
|
|
1890
|
+
const needle = new TextEncoder().encode('"type":"sync-fragment"');
|
|
1891
|
+
return findSubarray2(headerSlice, needle) !== -1;
|
|
1892
|
+
}
|
|
1893
|
+
function chunkSyncMessage(bytes, id, chunkSize = SYNC_FRAGMENT_CHUNK_SIZE) {
|
|
1894
|
+
const total = Math.max(1, Math.ceil(bytes.length / chunkSize));
|
|
1895
|
+
const fragments = [];
|
|
1896
|
+
for (let index = 0;index < total; index++) {
|
|
1897
|
+
const start = index * chunkSize;
|
|
1898
|
+
const end = Math.min(start + chunkSize, bytes.length);
|
|
1899
|
+
fragments.push(serialiseSyncFragment({ type: "sync-fragment", id, index, total }, bytes.subarray(start, end)));
|
|
1900
|
+
}
|
|
1901
|
+
return fragments;
|
|
1902
|
+
}
|
|
1903
|
+
function reassembleSyncFragments(chunks, total) {
|
|
1904
|
+
let totalBytes = 0;
|
|
1905
|
+
for (let i = 0;i < total; i++) {
|
|
1906
|
+
const chunk = chunks.get(i);
|
|
1907
|
+
if (!chunk) {
|
|
1908
|
+
throw new Error(`reassembleSyncFragments: missing fragment ${i} of ${total}`);
|
|
1909
|
+
}
|
|
1910
|
+
totalBytes += chunk.length;
|
|
1911
|
+
}
|
|
1912
|
+
const out = new Uint8Array(totalBytes);
|
|
1913
|
+
let offset = 0;
|
|
1914
|
+
for (let i = 0;i < total; i++) {
|
|
1915
|
+
const chunk = chunks.get(i);
|
|
1916
|
+
out.set(chunk, offset);
|
|
1917
|
+
offset += chunk.length;
|
|
1918
|
+
}
|
|
1919
|
+
return out;
|
|
1920
|
+
}
|
|
1921
|
+
function findSubarray2(haystack, needle) {
|
|
1922
|
+
if (needle.length === 0)
|
|
1923
|
+
return 0;
|
|
1924
|
+
outer:
|
|
1925
|
+
for (let i = 0;i <= haystack.length - needle.length; i++) {
|
|
1926
|
+
for (let j = 0;j < needle.length; j++) {
|
|
1927
|
+
if (haystack[i + j] !== needle[j])
|
|
1928
|
+
continue outer;
|
|
1929
|
+
}
|
|
1930
|
+
return i;
|
|
1931
|
+
}
|
|
1932
|
+
return -1;
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1935
|
+
// src/shared/lib/mesh-webrtc-adapter.ts
|
|
1850
1936
|
var DEFAULT_ICE_SERVERS = [
|
|
1851
1937
|
{ urls: "stun:stun.l.google.com:19302" },
|
|
1852
1938
|
{ urls: "stun:stun1.l.google.com:19302" }
|
|
@@ -1965,11 +2051,22 @@ class MeshWebRTCAdapter extends NetworkAdapter2 {
|
|
|
1965
2051
|
slot = this.createInitiatingSlot(targetId);
|
|
1966
2052
|
}
|
|
1967
2053
|
if (slot.channel && slot.channel.readyState === "open") {
|
|
1968
|
-
slot.channel
|
|
2054
|
+
this.sendBytesMaybeFragmented(slot.channel, bytes);
|
|
1969
2055
|
} else {
|
|
1970
2056
|
slot.pendingSends.push(bytes);
|
|
1971
2057
|
}
|
|
1972
2058
|
}
|
|
2059
|
+
sendBytesMaybeFragmented(channel, bytes) {
|
|
2060
|
+
if (bytes.length <= SYNC_FRAGMENT_THRESHOLD) {
|
|
2061
|
+
channel.send(bytes);
|
|
2062
|
+
return;
|
|
2063
|
+
}
|
|
2064
|
+
const id = crypto.randomUUID();
|
|
2065
|
+
const fragments = chunkSyncMessage(bytes, id);
|
|
2066
|
+
for (const fragment of fragments) {
|
|
2067
|
+
channel.send(fragment);
|
|
2068
|
+
}
|
|
2069
|
+
}
|
|
1973
2070
|
handleSignal(fromPeerId, rawPayload) {
|
|
1974
2071
|
const payload = rawPayload;
|
|
1975
2072
|
if (!payload || typeof payload !== "object" || !("kind" in payload)) {
|
|
@@ -1990,7 +2087,13 @@ class MeshWebRTCAdapter extends NetworkAdapter2 {
|
|
|
1990
2087
|
createInitiatingSlot(targetId) {
|
|
1991
2088
|
const connection = new this.RTCPeerConnectionCtor({ iceServers: this.iceServers });
|
|
1992
2089
|
const channel = connection.createDataChannel(this.dataChannelLabel, { ordered: true });
|
|
1993
|
-
const slot = {
|
|
2090
|
+
const slot = {
|
|
2091
|
+
connection,
|
|
2092
|
+
channel,
|
|
2093
|
+
pendingSends: [],
|
|
2094
|
+
pendingFragments: new Map,
|
|
2095
|
+
pendingRemoteIce: []
|
|
2096
|
+
};
|
|
1994
2097
|
this.slots.set(targetId, slot);
|
|
1995
2098
|
this.wireConnection(targetId, connection);
|
|
1996
2099
|
this.wireDataChannel(targetId, channel);
|
|
@@ -2014,7 +2117,13 @@ class MeshWebRTCAdapter extends NetworkAdapter2 {
|
|
|
2014
2117
|
this.slots.delete(fromPeerId);
|
|
2015
2118
|
}
|
|
2016
2119
|
const connection = new this.RTCPeerConnectionCtor({ iceServers: this.iceServers });
|
|
2017
|
-
const slot = {
|
|
2120
|
+
const slot = {
|
|
2121
|
+
connection,
|
|
2122
|
+
channel: undefined,
|
|
2123
|
+
pendingSends: [],
|
|
2124
|
+
pendingFragments: new Map,
|
|
2125
|
+
pendingRemoteIce: []
|
|
2126
|
+
};
|
|
2018
2127
|
this.slots.set(fromPeerId, slot);
|
|
2019
2128
|
this.wireConnection(fromPeerId, connection);
|
|
2020
2129
|
connection.ondatachannel = (event) => {
|
|
@@ -2022,6 +2131,7 @@ class MeshWebRTCAdapter extends NetworkAdapter2 {
|
|
|
2022
2131
|
this.wireDataChannel(fromPeerId, event.channel);
|
|
2023
2132
|
};
|
|
2024
2133
|
await connection.setRemoteDescription(sdp);
|
|
2134
|
+
await this.flushPendingRemoteIce(slot);
|
|
2025
2135
|
const answer = await connection.createAnswer();
|
|
2026
2136
|
await connection.setLocalDescription(answer);
|
|
2027
2137
|
this.signaling.sendSignal(fromPeerId, {
|
|
@@ -2036,15 +2146,31 @@ class MeshWebRTCAdapter extends NetworkAdapter2 {
|
|
|
2036
2146
|
if (slot.connection.signalingState !== "have-local-offer")
|
|
2037
2147
|
return;
|
|
2038
2148
|
await slot.connection.setRemoteDescription(sdp);
|
|
2149
|
+
await this.flushPendingRemoteIce(slot);
|
|
2039
2150
|
}
|
|
2040
2151
|
async handleIceCandidate(fromPeerId, candidate) {
|
|
2041
2152
|
const slot = this.slots.get(fromPeerId);
|
|
2042
2153
|
if (!slot)
|
|
2043
2154
|
return;
|
|
2155
|
+
if (slot.connection.remoteDescription === null) {
|
|
2156
|
+
slot.pendingRemoteIce.push(candidate);
|
|
2157
|
+
return;
|
|
2158
|
+
}
|
|
2044
2159
|
try {
|
|
2045
2160
|
await slot.connection.addIceCandidate(candidate);
|
|
2046
2161
|
} catch {}
|
|
2047
2162
|
}
|
|
2163
|
+
async flushPendingRemoteIce(slot) {
|
|
2164
|
+
if (slot.pendingRemoteIce.length === 0)
|
|
2165
|
+
return;
|
|
2166
|
+
const queued = slot.pendingRemoteIce;
|
|
2167
|
+
slot.pendingRemoteIce = [];
|
|
2168
|
+
for (const candidate of queued) {
|
|
2169
|
+
try {
|
|
2170
|
+
await slot.connection.addIceCandidate(candidate);
|
|
2171
|
+
} catch {}
|
|
2172
|
+
}
|
|
2173
|
+
}
|
|
2048
2174
|
wireConnection(peerId, connection) {
|
|
2049
2175
|
connection.onicecandidate = (event) => {
|
|
2050
2176
|
if (event.candidate) {
|
|
@@ -2073,7 +2199,7 @@ class MeshWebRTCAdapter extends NetworkAdapter2 {
|
|
|
2073
2199
|
if (!slot)
|
|
2074
2200
|
return;
|
|
2075
2201
|
for (const bytes of slot.pendingSends) {
|
|
2076
|
-
|
|
2202
|
+
this.sendBytesMaybeFragmented(channel, bytes);
|
|
2077
2203
|
}
|
|
2078
2204
|
slot.pendingSends = [];
|
|
2079
2205
|
};
|
|
@@ -2094,6 +2220,10 @@ class MeshWebRTCAdapter extends NetworkAdapter2 {
|
|
|
2094
2220
|
}
|
|
2095
2221
|
dispatchMessage(fromPeerId, bytes) {
|
|
2096
2222
|
try {
|
|
2223
|
+
if (isSyncFragmentType(bytes)) {
|
|
2224
|
+
this.handleSyncFragment(fromPeerId, bytes);
|
|
2225
|
+
return;
|
|
2226
|
+
}
|
|
2097
2227
|
if (this.onBlobMessage && isBlobMessageType(bytes)) {
|
|
2098
2228
|
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
2099
2229
|
const headerLen = view.getUint32(0, false);
|
|
@@ -2106,6 +2236,26 @@ class MeshWebRTCAdapter extends NetworkAdapter2 {
|
|
|
2106
2236
|
this.emit("message", message);
|
|
2107
2237
|
} catch {}
|
|
2108
2238
|
}
|
|
2239
|
+
handleSyncFragment(fromPeerId, bytes) {
|
|
2240
|
+
const parsed = parseSyncFragment(bytes);
|
|
2241
|
+
if (!parsed)
|
|
2242
|
+
return;
|
|
2243
|
+
const slot = this.slots.get(fromPeerId);
|
|
2244
|
+
if (!slot)
|
|
2245
|
+
return;
|
|
2246
|
+
const { header, data } = parsed;
|
|
2247
|
+
let entry = slot.pendingFragments.get(header.id);
|
|
2248
|
+
if (!entry) {
|
|
2249
|
+
entry = { chunks: new Map, total: header.total };
|
|
2250
|
+
slot.pendingFragments.set(header.id, entry);
|
|
2251
|
+
}
|
|
2252
|
+
entry.chunks.set(header.index, data.slice());
|
|
2253
|
+
if (entry.chunks.size < entry.total)
|
|
2254
|
+
return;
|
|
2255
|
+
slot.pendingFragments.delete(header.id);
|
|
2256
|
+
const reassembled = reassembleSyncFragments(entry.chunks, entry.total);
|
|
2257
|
+
this.dispatchMessage(fromPeerId, reassembled);
|
|
2258
|
+
}
|
|
2109
2259
|
get connectedPeerIds() {
|
|
2110
2260
|
const ids = [];
|
|
2111
2261
|
for (const [peerId, slot] of this.slots) {
|
|
@@ -2648,4 +2798,4 @@ export {
|
|
|
2648
2798
|
$meshCounter
|
|
2649
2799
|
};
|
|
2650
2800
|
|
|
2651
|
-
//# debugId=
|
|
2801
|
+
//# debugId=0A403673455F136164756E2164756E21
|
package/dist/src/mesh.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/shared/lib/encryption.ts", "../src/shared/lib/wasm-init.ts", "../src/shared/lib/blob-cache.ts", "../src/shared/lib/blob-ref.ts", "../src/shared/lib/blob-transfer.ts", "../src/shared/lib/blob-store-impl.ts", "../src/mesh.ts", "../src/shared/lib/keyring-storage.ts", "../src/shared/lib/mesh-client.ts", "../src/shared/lib/mesh-network-adapter.ts", "../src/shared/lib/signing.ts", "../src/shared/lib/mesh-signaling-client.ts", "../src/shared/lib/mesh-state.ts", "../src/shared/lib/crdt-specialised.ts", "../src/shared/lib/migrate-primitive.ts", "../src/shared/lib/primitive-registry.ts", "../src/shared/lib/schema-version.ts", "../src/shared/lib/crdt-state.ts", "../src/shared/lib/mesh-webrtc-adapter.ts", "../src/shared/lib/pairing.ts", "../src/shared/lib/revocation.ts"],
|
|
3
|
+
"sources": ["../src/shared/lib/encryption.ts", "../src/shared/lib/wasm-init.ts", "../src/shared/lib/blob-cache.ts", "../src/shared/lib/blob-ref.ts", "../src/shared/lib/blob-transfer.ts", "../src/shared/lib/blob-store-impl.ts", "../src/mesh.ts", "../src/shared/lib/keyring-storage.ts", "../src/shared/lib/mesh-client.ts", "../src/shared/lib/mesh-network-adapter.ts", "../src/shared/lib/signing.ts", "../src/shared/lib/mesh-signaling-client.ts", "../src/shared/lib/mesh-state.ts", "../src/shared/lib/crdt-specialised.ts", "../src/shared/lib/migrate-primitive.ts", "../src/shared/lib/primitive-registry.ts", "../src/shared/lib/schema-version.ts", "../src/shared/lib/crdt-state.ts", "../src/shared/lib/mesh-webrtc-adapter.ts", "../src/shared/lib/sync-fragment.ts", "../src/shared/lib/pairing.ts", "../src/shared/lib/revocation.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * encryption — symmetric authenticated encryption for Polly's $meshState\n * primitive (Phase 2). Wraps tweetnacl's secretbox (XSalsa20-Poly1305) with\n * a small Polly-flavoured API so the rest of the codebase never imports\n * tweetnacl directly.\n *\n * Every $meshState document has a per-document symmetric key that is\n * provisioned to authorised peers at pairing time and never held by any\n * server. Outgoing operations are encrypted under this key before they\n * touch the network adapter; incoming operations are decrypted on receipt.\n * The signing layer in {@link signing.ts} provides authenticity (proof of\n * who sent the message); this layer provides confidentiality (the bytes\n * are unreadable to anything that does not hold the document key).\n *\n * tweetnacl's secretbox uses a 32-byte symmetric key and a 24-byte nonce.\n * The output of `nacl.secretbox` is the ciphertext concatenated with a\n * 16-byte Poly1305 authentication tag. We package the nonce + ciphertext\n * into a single binary blob using a small length-prefixed envelope so the\n * receiver can recover the nonce without out-of-band coordination.\n *\n * - {@link generateDocumentKey} returns a fresh 32-byte symmetric key.\n *\n * - {@link encrypt} produces a sealed blob from a payload and a key.\n *\n * - {@link decrypt} recovers the payload from a sealed blob and a key.\n * Returns undefined if the blob is malformed or the authentication\n * tag does not match (i.e. wrong key or tampered ciphertext) — the\n * undefined signal lets call sites distinguish \"wrong key\" from\n * \"structurally invalid\" without throwing.\n *\n * - {@link sealEnvelope} and {@link openEnvelope} are convenience helpers\n * that wrap encrypt/decrypt in a structured EncryptedEnvelope shape so\n * the mesh transport layer can handle the binary plumbing uniformly.\n */\n\nimport nacl from \"tweetnacl\";\n\n/** Length in bytes of a secretbox symmetric key. */\nexport const KEY_BYTES = 32;\n/** Length in bytes of a secretbox nonce. */\nexport const NONCE_BYTES = 24;\n/** Length in bytes of the Poly1305 authentication tag. */\nexport const TAG_BYTES = 16;\n\n/**\n * A sealed blob suitable for storage or network transmission. The wire\n * layout is the concatenation of the nonce and the ciphertext+tag from\n * tweetnacl. Callers should not depend on the exact bytes — round-trip\n * through {@link encrypt} / {@link decrypt} or the envelope helpers.\n */\nexport type SealedBytes = Uint8Array;\n\n/** Errors thrown by the encryption subsystem. */\nexport class EncryptionError extends Error {\n readonly code: \"invalid-key-length\" | \"decrypt-failed\" | \"envelope-malformed\";\n constructor(message: string, code: EncryptionError[\"code\"]) {\n super(message);\n this.name = \"EncryptionError\";\n this.code = code;\n }\n}\n\n/**\n * Generate a fresh 32-byte symmetric document key. Calls into tweetnacl's\n * CSPRNG.\n */\nexport function generateDocumentKey(): Uint8Array {\n return nacl.randomBytes(KEY_BYTES);\n}\n\n/**\n * Encrypt a payload under a symmetric key. The returned blob includes a\n * fresh nonce so the receiver does not need any out-of-band coordination\n * to decrypt.\n */\nexport function encrypt(payload: Uint8Array, key: Uint8Array): SealedBytes {\n if (key.length !== KEY_BYTES) {\n throw new EncryptionError(\n `secretbox key must be ${KEY_BYTES} bytes, got ${key.length}.`,\n \"invalid-key-length\"\n );\n }\n const nonce = nacl.randomBytes(NONCE_BYTES);\n const ciphertext = nacl.secretbox(payload, nonce, key);\n const out = new Uint8Array(NONCE_BYTES + ciphertext.length);\n out.set(nonce, 0);\n out.set(ciphertext, NONCE_BYTES);\n return out;\n}\n\n/**\n * Decrypt a sealed blob under a symmetric key. Returns the original\n * payload on success. Returns undefined if the blob is too short to\n * contain a nonce and tag, or if the authentication tag does not match\n * (which indicates either a wrong key or a tampered ciphertext).\n *\n * The undefined return is deliberate: call sites typically want to fall\n * back to a different key or surface a \"could not decrypt\" message rather\n * than catching an exception. Use {@link decryptOrThrow} when an exception\n * is preferred.\n */\nexport function decrypt(sealed: SealedBytes, key: Uint8Array): Uint8Array | undefined {\n if (key.length !== KEY_BYTES) {\n throw new EncryptionError(\n `secretbox key must be ${KEY_BYTES} bytes, got ${key.length}.`,\n \"invalid-key-length\"\n );\n }\n if (sealed.length < NONCE_BYTES + TAG_BYTES) {\n return undefined;\n }\n const nonce = sealed.subarray(0, NONCE_BYTES);\n const ciphertext = sealed.subarray(NONCE_BYTES);\n const opened = nacl.secretbox.open(ciphertext, nonce, key);\n return opened ?? undefined;\n}\n\n/**\n * Decrypt a sealed blob, throwing {@link EncryptionError} on failure\n * instead of returning undefined.\n */\nexport function decryptOrThrow(sealed: SealedBytes, key: Uint8Array): Uint8Array {\n const opened = decrypt(sealed, key);\n if (!opened) {\n throw new EncryptionError(\n `Failed to decrypt sealed blob: wrong key, malformed input, or tampered ciphertext.`,\n \"decrypt-failed\"\n );\n }\n return opened;\n}\n\n/**\n * A high-level structured envelope combining encryption with a small\n * amount of metadata the receiver needs to find the right key. The mesh\n * network adapter uses this shape on the wire.\n */\nexport interface EncryptedEnvelope {\n /** Stable identifier for the document this payload belongs to. The\n * receiver looks this up in its local key store to find the right key. */\n documentId: string;\n /** Sealed blob containing the encrypted payload plus its nonce. */\n sealed: SealedBytes;\n}\n\n/**\n * Encrypt a payload and pack it into an {@link EncryptedEnvelope} along\n * with the document id.\n */\nexport function sealEnvelope(\n payload: Uint8Array,\n documentId: string,\n key: Uint8Array\n): EncryptedEnvelope {\n return {\n documentId,\n sealed: encrypt(payload, key),\n };\n}\n\n/**\n * Decrypt an {@link EncryptedEnvelope} using the given key. Throws on\n * failure for symmetry with {@link sealEnvelope}.\n */\nexport function openEnvelope(envelope: EncryptedEnvelope, key: Uint8Array): Uint8Array {\n return decryptOrThrow(envelope.sealed, key);\n}\n\n/**\n * Serialise an {@link EncryptedEnvelope} to a single binary blob.\n *\n * Wire format:\n *\n * [4 bytes BE: documentId byte length]\n * [N bytes: documentId UTF-8]\n * [remaining: sealed blob (nonce + ciphertext + tag)]\n */\nexport function encodeEncryptedEnvelope(envelope: EncryptedEnvelope): Uint8Array {\n const idBytes = new TextEncoder().encode(envelope.documentId);\n const out = new Uint8Array(4 + idBytes.length + envelope.sealed.length);\n const view = new DataView(out.buffer);\n view.setUint32(0, idBytes.length, false);\n out.set(idBytes, 4);\n out.set(envelope.sealed, 4 + idBytes.length);\n return out;\n}\n\n/**\n * Deserialise a binary envelope produced by {@link encodeEncryptedEnvelope}.\n * Throws on malformed input.\n */\nexport function decodeEncryptedEnvelope(bytes: Uint8Array): EncryptedEnvelope {\n if (bytes.length < 4) {\n throw new EncryptionError(\n `Encrypted envelope too short: ${bytes.length} bytes.`,\n \"envelope-malformed\"\n );\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const idLen = view.getUint32(0, false);\n if (bytes.length < 4 + idLen) {\n throw new EncryptionError(\n `Encrypted envelope truncated: declared id length ${idLen}, total ${bytes.length}.`,\n \"envelope-malformed\"\n );\n }\n const documentId = new TextDecoder().decode(bytes.subarray(4, 4 + idLen));\n const sealed = bytes.slice(4 + idLen);\n return { documentId, sealed };\n}\n",
|
|
6
6
|
"/**\n * Eagerly initialise Automerge's WebAssembly runtime by pointing the library\n * at the raw `.wasm` file shipped in `@automerge/automerge`.\n *\n * The `import.meta.url` pattern below is recognised by every modern bundler\n * (Bun, Vite, webpack 5+, esbuild) as an asset reference: the `.wasm` gets\n * copied into the consumer's output alongside the JavaScript, and the URL is\n * rewritten to point at the copied file. `initializeWasm` then fetches and\n * instantiates it at runtime. That keeps the WebAssembly out of the JavaScript\n * bundle entirely — no megabyte-scale base64 string inlined per subpath — and\n * lets the browser parse the JS and stream-compile the `.wasm` in parallel.\n *\n * The top-level `await` makes this module async so any consumer that\n * transitively imports it inherits the \"wait for WASM\" behaviour through the\n * import graph, without needing an explicit init call.\n */\n\nimport wasmPath from \"@automerge/automerge/automerge.wasm\";\nimport { initializeWasm } from \"@automerge/automerge-repo/slim\";\n\n// Bun's file loader returns a relative path; resolving it against the\n// current module's URL yields an absolute URL that fetches correctly\n// regardless of where the consumer's bundler places the script.\nconst wasmUrl = new URL(wasmPath, import.meta.url).href;\n\nawait initializeWasm(wasmUrl);\n",
|
|
@@ -20,11 +20,12 @@
|
|
|
20
20
|
"/**\n * PrimitiveRegistry — runtime namespace collision detection across Polly's\n * synced state primitives.\n *\n * The three primitive families ($sharedState, $peerState, $meshState) each store\n * data under a developer-chosen logical key. If two different primitives both\n * claim the same key, the developer almost certainly has a bug: the on-disk\n * formats are incompatible, no sync happens between them, and whichever primitive\n * resolves first silently \"wins\" from the developer's perspective. By the time\n * the mistake is noticed, data has diverged.\n *\n * The registry catches the mistake at the first mismatched registration and\n * throws a structured error naming the key, both primitives, and (when available)\n * the call site of each registration. This is run-to-failure by design: a\n * collision is always a bug, and the failure should be loud.\n *\n * Same primitive re-registering the same key is allowed and is a no-op — it\n * supports hot module reloading and component re-mounts without spurious errors.\n * Changing the primitive kind of an existing key is still an error; developers\n * doing that during local HMR should hard-reload to reset the registry.\n *\n * @example\n * ```ts\n * primitiveRegistry.register(\"notes\", \"sharedState\", \"src/app.ts:10\");\n * primitiveRegistry.register(\"notes\", \"peerState\", \"src/other.ts:22\");\n * // throws PrimitiveCollisionError — names both primitives and both call sites\n * ```\n */\n\n/**\n * Canonical identifiers for Polly's synced state primitives. The registry\n * uses these as opaque labels; nothing else in Polly needs to match them.\n */\nexport type PrimitiveKind =\n | \"sharedState\"\n | \"syncedState\"\n | \"persistedState\"\n | \"state\"\n | \"peerState\"\n | \"meshState\";\n\n/**\n * Thrown when a logical key is registered under more than one primitive.\n * The message names the key, both primitives, and (when available) the\n * call site of each registration, so the developer can navigate to both\n * sites from the error output.\n */\nexport class PrimitiveCollisionError extends Error {\n readonly key: string;\n readonly firstPrimitive: PrimitiveKind;\n readonly firstCallSite: string | undefined;\n readonly secondPrimitive: PrimitiveKind;\n readonly secondCallSite: string | undefined;\n\n constructor(\n key: string,\n firstPrimitive: PrimitiveKind,\n firstCallSite: string | undefined,\n secondPrimitive: PrimitiveKind,\n secondCallSite: string | undefined\n ) {\n const firstLocation = firstCallSite ? ` (at ${firstCallSite})` : \"\";\n const secondLocation = secondCallSite ? ` (at ${secondCallSite})` : \"\";\n super(\n `Polly primitive key collision: \"${key}\" is already registered as ` +\n `$${firstPrimitive}${firstLocation} and cannot also be registered ` +\n `as $${secondPrimitive}${secondLocation}. Pick a different key or ` +\n `use the same primitive in both places.`\n );\n this.name = \"PrimitiveCollisionError\";\n this.key = key;\n this.firstPrimitive = firstPrimitive;\n this.firstCallSite = firstCallSite;\n this.secondPrimitive = secondPrimitive;\n this.secondCallSite = secondCallSite;\n }\n}\n\ntype RegistryEntry = {\n primitive: PrimitiveKind;\n callSite: string | undefined;\n};\n\n/**\n * A small Map-backed registry of \"logical key → primitive kind\". Exported as\n * a class so tests can construct fresh instances without sharing state; the\n * module-level {@link primitiveRegistry} singleton is what application code\n * actually uses.\n */\nexport class PrimitiveRegistry {\n private readonly entries = new Map<string, RegistryEntry>();\n\n /**\n * Register a key under a primitive kind. Re-registering the same key under\n * the same primitive is a no-op, which is what hot module reloading and\n * component re-mounts produce.\n *\n * @throws {PrimitiveCollisionError} if the key is already registered under\n * a different primitive kind.\n */\n register(key: string, primitive: PrimitiveKind, callSite?: string): void {\n const existing = this.entries.get(key);\n if (existing && existing.primitive !== primitive) {\n throw new PrimitiveCollisionError(\n key,\n existing.primitive,\n existing.callSite,\n primitive,\n callSite\n );\n }\n if (!existing) {\n this.entries.set(key, { primitive, callSite });\n }\n }\n\n /**\n * True if the key has been registered (under any primitive kind).\n */\n has(key: string): boolean {\n return this.entries.has(key);\n }\n\n /**\n * Look up the primitive kind a key is registered under, if any.\n * Returns undefined for unregistered keys.\n */\n kindOf(key: string): PrimitiveKind | undefined {\n return this.entries.get(key)?.primitive;\n }\n\n /**\n * Drop every registration. Intended for test setup and teardown; application\n * code should not call this.\n */\n clear(): void {\n this.entries.clear();\n }\n\n /**\n * Number of registered keys. Intended for tests.\n */\n get size(): number {\n return this.entries.size;\n }\n}\n\n/**\n * The process-wide primitive registry. Application code registers here\n * implicitly via primitive constructors; tests can reset it with `clear()`.\n */\nexport const primitiveRegistry = new PrimitiveRegistry();\n",
|
|
21
21
|
"/**\n * schema-version — plumbing for the shared schema-version migration protocol\n * used by $peerState and $meshState documents.\n *\n * Every peer-first document carries a reserved schema-version field. When a\n * client loads a document whose stored version is lower than the application's\n * declared target version, Polly walks the registered migrations in sequence,\n * mutating the document from one version to the next, and stamps the new\n * version on the way through. When the stored version is higher, Polly refuses\n * to load and surfaces a structured error: the application is older than the\n * document and should be upgraded.\n *\n * For concurrent writes across mixed client versions, every op also carries\n * the schema version under which it was produced. Ops whose version is lower\n * than the document's current version are rejected at sync time; the peer\n * producing them needs to upgrade its local replica through the migration\n * runner before retrying. Ops whose version is higher mean the current peer\n * is behind the application that produced them; rejecting them prevents\n * corruption while still surfacing the mismatch to the user.\n *\n * This module provides only the plumbing — the reserved field name, the\n * reader and writer for the version field, the migration runner, and the\n * op-version compatibility check. Phase 1 and Phase 2 primitives will consume\n * these helpers; nothing in this file depends on Automerge or any transport.\n */\n\n/**\n * The reserved field name used to store the schema version on every peer-first\n * document. Applications must not use this field for their own data; the\n * primitive constructors reserve it at the document boundary.\n */\nexport const SCHEMA_VERSION_FIELD = \"__schemaVersion\" as const;\n\n/**\n * The minimal shape every peer-first document satisfies. Applications layer\n * their own fields on top of this; the reserved {@link SCHEMA_VERSION_FIELD}\n * is the only required key.\n */\nexport type VersionedDoc = {\n [SCHEMA_VERSION_FIELD]?: number;\n [otherField: string]: unknown;\n};\n\n/**\n * A single migration step. Mutates the document in place, transforming it\n * from version (target - 1) to version target. The implementation must be\n * total (accept any valid v(target-1) document) and deterministic (running\n * it twice produces the same result). Applications that want return-a-new-doc\n * semantics should copy inside the migration body rather than returning.\n */\nexport type Migration = (doc: Record<string, unknown>) => void;\n\n/**\n * A map from target schema version to the migration that produces it. The\n * keys must be contiguous from 1 upward through the application's target\n * version, with no gaps. Gaps throw at migration time.\n *\n * @example\n * ```ts\n * const migrations: Migrations = {\n * 1: (doc) => { doc[\"title\"] = \"\"; }, // v0 → v1\n * 2: (doc) => { doc[\"tags\"] = []; }, // v1 → v2\n * 3: (doc) => { doc[\"archived\"] = false; delete doc[\"deleted\"]; }, // v2 → v3\n * };\n * ```\n */\nexport type Migrations = Record<number, Migration>;\n\n/**\n * Error thrown by the schema-version subsystem. The `code` field distinguishes\n * the failure modes so that callers (primitive constructors, application error\n * handlers) can decide whether to surface the error to the user, prompt an\n * upgrade, or drop the offending op.\n */\nexport class SchemaVersionError extends Error {\n readonly code:\n | \"doc-ahead-of-app\"\n | \"missing-migration\"\n | \"op-older-than-doc\"\n | \"op-newer-than-doc\";\n readonly docVersion?: number;\n readonly targetVersion?: number;\n readonly opVersion?: number;\n readonly missingVersion?: number;\n\n constructor(\n message: string,\n code: SchemaVersionError[\"code\"],\n details: {\n docVersion?: number;\n targetVersion?: number;\n opVersion?: number;\n missingVersion?: number;\n } = {}\n ) {\n super(message);\n this.name = \"SchemaVersionError\";\n this.code = code;\n if (details.docVersion !== undefined) this.docVersion = details.docVersion;\n if (details.targetVersion !== undefined) this.targetVersion = details.targetVersion;\n if (details.opVersion !== undefined) this.opVersion = details.opVersion;\n if (details.missingVersion !== undefined) this.missingVersion = details.missingVersion;\n }\n}\n\n/**\n * Read the schema version stored on a document. Returns 0 for documents that\n * have never been stamped (undefined field), which is the canonical \"pre-v1\"\n * sentinel — the first migration in a registry is always keyed at 1 and\n * handles the undefined-to-1 transition.\n */\nexport function getDocVersion(doc: unknown): number {\n if (typeof doc !== \"object\" || doc === null) return 0;\n const record = doc as unknown as Record<string, unknown>;\n const value = record[SCHEMA_VERSION_FIELD];\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0 ? value : 0;\n}\n\n/**\n * Stamp a schema version onto a document in place. Primitive constructors call\n * this after each migration step and once on document creation.\n */\nexport function setDocVersion(doc: Record<string, unknown>, version: number): void {\n doc[SCHEMA_VERSION_FIELD] = version;\n}\n\n/**\n * Run any pending migrations on a document. Mutates the document in place.\n *\n * @throws {SchemaVersionError} with code `doc-ahead-of-app` if the document is\n * already at a version higher than the application's target.\n * @throws {SchemaVersionError} with code `missing-migration` if an intermediate\n * migration is missing from the registry.\n */\nexport function runMigrations(\n doc: Record<string, unknown>,\n targetVersion: number,\n migrations: Migrations\n): void {\n const current = getDocVersion(doc);\n if (current > targetVersion) {\n throw new SchemaVersionError(\n `Document is at schema version ${current} but the application targets ${targetVersion}. Upgrade the application to continue.`,\n \"doc-ahead-of-app\",\n { docVersion: current, targetVersion }\n );\n }\n for (let v = current + 1; v <= targetVersion; v++) {\n const migration = migrations[v];\n if (!migration) {\n throw new SchemaVersionError(\n `Missing migration for schema version ${v}. Migrations must be contiguous from ${current + 1} through ${targetVersion}.`,\n \"missing-migration\",\n { docVersion: current, targetVersion, missingVersion: v }\n );\n }\n migration(doc);\n setDocVersion(doc, v);\n }\n}\n\n/**\n * Result of an op-version compatibility check. Discriminated by the {@link compatible}\n * field so callers can switch cleanly.\n */\nexport type OpVersionCheck =\n | { compatible: true }\n | {\n compatible: false;\n reason: \"op-older-than-doc\" | \"op-newer-than-doc\";\n opVersion: number;\n docVersion: number;\n };\n\n/**\n * Check whether an incoming op's declared schema version is compatible with\n * the document's current version. Ops that match are applied; ops that are\n * older are rejected (the producing peer is behind and should migrate); ops\n * that are newer are also rejected (the current peer is behind and should\n * upgrade).\n */\nexport function checkOpVersion(opVersion: number, docVersion: number): OpVersionCheck {\n if (opVersion < docVersion) {\n return { compatible: false, reason: \"op-older-than-doc\", opVersion, docVersion };\n }\n if (opVersion > docVersion) {\n return { compatible: false, reason: \"op-newer-than-doc\", opVersion, docVersion };\n }\n return { compatible: true };\n}\n\n/**\n * Convenience wrapper around {@link checkOpVersion} that throws a structured\n * {@link SchemaVersionError} on incompatibility. Useful inside sync handlers\n * that want to surface the mismatch through their normal error pipeline.\n */\nexport function assertOpVersion(opVersion: number, docVersion: number): void {\n const result = checkOpVersion(opVersion, docVersion);\n if (result.compatible) return;\n const message =\n result.reason === \"op-older-than-doc\"\n ? `Incoming op was produced at schema version ${opVersion} but the document is at version ${docVersion}. The producing peer is behind.`\n : `Incoming op was produced at schema version ${opVersion} but the document is at version ${docVersion}. The current peer is behind and should upgrade.`;\n throw new SchemaVersionError(message, result.reason, { opVersion, docVersion });\n}\n",
|
|
22
22
|
"/**\n * crdt-state — base machinery for Polly's peer-first state primitives.\n *\n * This module is transport-agnostic: it takes a caller-supplied async factory\n * that produces a ready {@link DocHandle}, binds it bidirectionally to a\n * Preact signal, runs any pending schema migrations on load, and integrates\n * with the primitive-registry and migration-registry guards. Phase 1's\n * $peerState and Phase 2's $meshState both construct these base primitives\n * with their own handle factories — one over Automerge-Repo's WebSocket\n * client adapter, the other over WebRTC — and the base never knows which.\n *\n * The signal-to-handle binding uses an `updating` guard flag to prevent write\n * loops: when a local signal assignment runs the effect that pushes the value\n * into `handle.change`, the flag is raised so that the 'change' event the\n * handle fires back is ignored. The same flag protects in the other direction\n * when a remote change seeds the signal.\n *\n * For the Phase 0 cut, writes are applied with a naive top-level structural\n * replacement inside the `Automerge.change` block. This is correct for\n * JSON-shaped documents with scalar and flat-object fields and is good enough\n * to exercise the rest of the pipeline. The specialised variants for text,\n * counters, and lists (which require type-specific operation capture to\n * preserve concurrent-edit semantics) land in Phase 1's crdt-specialised.ts.\n */\n\nimport type { DocHandle } from \"@automerge/automerge-repo/slim\";\nimport { effect, signal } from \"@preact/signals\";\nimport type { Access } from \"./access\";\nimport { type MigratableState, MigrationError, migrationRegistry } from \"./migrate-primitive\";\nimport { type PrimitiveKind, primitiveRegistry } from \"./primitive-registry\";\nimport {\n type Migrations,\n runMigrations,\n SCHEMA_VERSION_FIELD,\n setDocVersion,\n type VersionedDoc,\n} from \"./schema-version\";\n\n/**\n * The interface a Polly peer-first primitive exposes at the call site. It\n * satisfies {@link MigratableState} so that the cross-primitive migration\n * helper can consume it directly.\n */\nexport interface CrdtPrimitive<T extends VersionedDoc> extends MigratableState<T> {\n /** Stable logical key the primitive was registered under. */\n readonly key: string;\n /** Primitive kind — one of the {@link PrimitiveKind} labels. */\n readonly primitive: PrimitiveKind;\n /** Current value. Writes push into the backing Automerge document. */\n value: T;\n /** Resolves when the handle is ready and migrations have run. */\n readonly loaded: Promise<void>;\n /** The underlying {@link DocHandle}, populated after {@link loaded} resolves.\n * Intended for advanced escape hatches; most callers should stay at the\n * signal surface. */\n readonly handle: DocHandle<T> | undefined;\n}\n\n/**\n * Options for constructing a base CRDT-backed primitive. Phase 1 and Phase 2\n * primitive constructors pass a transport-specific {@link getHandle} factory\n * and their own {@link primitive} label; everything else is shared.\n */\nexport interface CrdtStateOptions<T extends VersionedDoc> {\n /** Stable logical key identifying this piece of state. */\n key: string;\n /** Primitive kind label for registry and error-message purposes. */\n primitive: PrimitiveKind;\n /** Initial value if no stored document exists yet. Applied by the caller's\n * handle factory; the base module does not create documents itself. */\n initialValue: T;\n /** Async factory that resolves to a ready {@link DocHandle}. The factory is\n * responsible for repo lookup, document creation, and any transport-specific\n * setup. The base module calls this once, during hydration. */\n getHandle: () => Promise<DocHandle<T>>;\n /** Target schema version for the application. If set, migrations run on\n * load to bring the document up to this version before the signal hydrates. */\n schemaVersion?: number;\n /** Migration table. Ignored if {@link schemaVersion} is not set. */\n migrations?: Migrations;\n /** Declarative access predicates. Not consumed by the base module; the\n * transport-specific constructors compile it to their enforcement layer. */\n access?: Access;\n /** Optional free-text call-site label for primitive-registry error messages. */\n callSite?: string;\n}\n\n/**\n * Construct a base CRDT-backed Polly primitive. Integrates with\n * primitive-registry (for collision detection), migration-registry (for\n * cross-family migration guards), and schema-version (for on-load migrations).\n *\n * @throws {MigrationError} if the source key has been marked as migrated.\n * @throws {PrimitiveCollisionError} if the key is already registered under a\n * different primitive kind.\n */\nexport function $crdtState<T extends VersionedDoc>(options: CrdtStateOptions<T>): CrdtPrimitive<T> {\n if (migrationRegistry.isMarked(options.key, options.primitive)) {\n throw new MigrationError(\n `Cannot construct $${options.primitive}(\"${options.key}\"): this key has been marked as migrated. Migrations are one-way; use the destination primitive instead.`,\n \"already-migrated\",\n options.key,\n options.primitive\n );\n }\n primitiveRegistry.register(options.key, options.primitive, options.callSite);\n\n const inner = signal<T>(options.initialValue);\n let updating = false;\n let currentHandle: DocHandle<T> | undefined;\n\n const loaded = (async () => {\n const handle = await options.getHandle();\n await handle.whenReady();\n currentHandle = handle;\n\n // Run any pending schema migrations inside a change block so they land\n // as a single Automerge operation set.\n if (options.schemaVersion !== undefined) {\n const targetVersion = options.schemaVersion;\n const migrations = options.migrations ?? {};\n handle.change((doc) => {\n runMigrations(doc as unknown as Record<string, unknown>, targetVersion, migrations);\n // runMigrations stamps the version on every intermediate step; make\n // sure the final value is recorded even when no migrations ran.\n setDocVersion(doc as unknown as Record<string, unknown>, targetVersion);\n });\n }\n\n // Seed the signal with the hydrated doc state. Raise the guard first so\n // the 'change' listener we install below does not echo this write back.\n updating = true;\n try {\n inner.value = cloneDoc(handle.doc());\n } finally {\n updating = false;\n }\n\n // Remote-changes-to-signal binding.\n handle.on(\"change\", (payload) => {\n if (updating) return;\n updating = true;\n try {\n inner.value = cloneDoc(payload.doc);\n } finally {\n updating = false;\n }\n });\n\n // Signal-to-remote binding. The effect runs once on registration with\n // the already-hydrated value; the guard makes that first run a no-op at\n // the handle level because updating is false but the doc already equals\n // the signal, so Automerge records no new operations.\n effect(() => {\n const value = inner.value;\n if (updating) return;\n if (!currentHandle) return;\n updating = true;\n try {\n currentHandle.change((doc) => {\n applyTopLevel(doc as unknown as Record<string, unknown>, value);\n });\n } finally {\n updating = false;\n }\n });\n })();\n\n return {\n key: options.key,\n primitive: options.primitive,\n get value() {\n return inner.value;\n },\n set value(next: T) {\n inner.value = next;\n },\n loaded,\n get handle() {\n return currentHandle;\n },\n };\n}\n\n/**\n * Shallow clone of an Automerge doc into a plain JS object. Automerge docs\n * are Proxies; the signal holds a detached plain-object snapshot so that\n * application code does not accidentally mutate the CRDT through the signal.\n */\nfunction cloneDoc<T>(doc: T): T {\n return JSON.parse(JSON.stringify(doc)) as unknown as T;\n}\n\n/**\n * Copy every top-level field from the incoming value onto the Automerge doc\n * — but only for fields whose serialised form actually differs from what's\n * already there. The equality skip is load-bearing, not an optimisation:\n *\n * - Automerge records a new operation for every assignment (`doc[k] = v`),\n * even when v is structurally identical to the current value.\n * - Every op triggers a state-machine transition, which via\n * `#checkForChanges` fires a `change` event, which the signal binding\n * above handles by setting `inner.value = cloneDoc(...)`.\n * - Under certain event-loop timings — most consistently on bun — preact\n * signals' synchronous effect propagation re-runs this write path with\n * the just-cloned value, which compares ref-different to the previous\n * signal value, so the effect doesn't short-circuit, so applyTopLevel\n * runs again, so more ops are recorded, and the whole chain loops until\n * preact's own cycle counter trips with \"Cycle detected\".\n *\n * Skipping value-equal assignments makes the write a true no-op at the\n * Automerge level, which makes `docChanged` in `#checkForChanges` false,\n * which skips the change emission, which breaks the loop at its origin.\n * Browsers mask this under typical interactive timing; a tight CLI boot\n * reproduces it every time.\n *\n * The reserved schema-version field is not copied — it is managed by the\n * migration subsystem and must not be overwritten by application writes.\n */\nfunction applyTopLevel<T extends VersionedDoc>(doc: Record<string, unknown>, value: T): void {\n const source = value as unknown as Record<string, unknown>;\n for (const key of Object.keys(value)) {\n if (key === SCHEMA_VERSION_FIELD) continue;\n const incoming = source[key];\n if (fieldEquals(doc[key], incoming)) continue;\n doc[key] = incoming;\n }\n}\n\n/** Structural equality check for the top-level-field comparison. JSON.stringify\n * round-trip because Automerge docs are Proxies and `===` would miss a match\n * when the proxy wraps an equal value. Arrays, objects, and primitives all\n * round-trip cleanly for the CRDT-state use case. Cycles in the input aren't\n * supported (neither is Automerge — it refuses cyclic structures). */\nfunction fieldEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch {\n return false;\n }\n}\n",
|
|
23
|
-
"/**\n * mesh-webrtc-adapter — Phase 2 browser-side WebRTC transport for Polly's\n * $meshState primitive. Extends Automerge's NetworkAdapter base class and\n * uses real native RTCPeerConnection / RTCDataChannel instances to carry\n * sync messages between peers.\n *\n * This is the \"base\" transport that MeshNetworkAdapter wraps with its\n * sign-then-encrypt envelope. The stack is:\n *\n * $meshState\n * └─ Repo\n * └─ MeshNetworkAdapter (sign + encrypt)\n * └─ MeshWebRTCAdapter (real data channels)\n * └─ MeshSignalingClient (SDP/ICE relay)\n * └─ signalingServer (Elysia plugin on the host app)\n *\n * Because WebRTC lives in browsers, this module is browser-only. It\n * assumes global RTCPeerConnection, RTCDataChannel, and WebSocket types\n * are available. Under bun:test the classes cannot be exercised\n * end-to-end — the first validation path is either Playwright running a\n * real browser, a Puppeteer harness, or a human testing a browser-side\n * example app that consumes the adapter.\n *\n * What this module does at runtime:\n *\n * - Constructs a MeshWebRTCAdapter with a signalling client and a local\n * peer id. No data channels exist at construction time.\n *\n * - When Automerge's NetworkSubsystem calls connect(peerId) on the\n * adapter, it starts listening for signals from remote peers and is\n * ready to build peer connections as they are discovered.\n *\n * - When a remote peer sends an SDP offer via the signalling channel,\n * the adapter builds a fresh RTCPeerConnection, accepts the offer,\n * produces an answer, sends it back through signalling, and wires the\n * received data channel to emit Automerge Message events upward.\n *\n * - When the local repo calls send(message), the adapter looks up the\n * peer connection for message.targetId and writes the serialised\n * bytes to its data channel. If no connection exists yet, the adapter\n * creates one by sending an SDP offer through signalling. Outgoing\n * messages are queued until the channel is open.\n *\n * - Disconnect tears down every peer connection and closes the\n * signalling client.\n */\n\nimport {\n type Message,\n NetworkAdapter,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\";\nimport { isBlobMessageType } from \"./blob-transfer\";\nimport type { MeshSignalingClient } from \"./mesh-signaling-client\";\n\n/** Standard STUN servers for NAT traversal. In production, callers who\n * need TURN fallback for peers behind symmetric NATs should replace this\n * with their own ICE server list. */\nexport const DEFAULT_ICE_SERVERS: RTCIceServer[] = [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"stun:stun1.l.google.com:19302\" },\n];\n\n/** Options for constructing a {@link MeshWebRTCAdapter}. */\nexport interface MeshWebRTCAdapterOptions {\n /** The signalling client the adapter uses to exchange SDP and ICE\n * candidates with other peers. Typically constructed once per\n * application and shared across any adapters that need it. */\n signaling: MeshSignalingClient;\n /** The local peer id. Must match the peer id the signalling client\n * registered with. */\n peerId: string;\n /** Peer ids to connect to on startup. When `connect()` is called, the\n * adapter iterates this list and initiates a WebRTC connection to each\n * one by sending an SDP offer through the signalling channel. Peers\n * not in this list can still connect by sending an offer *to* this\n * adapter. The natural source for this list is the keyring's\n * knownPeers map keys. */\n knownPeerIds?: string[];\n /** Optional ICE server list override. Defaults to {@link DEFAULT_ICE_SERVERS}. */\n iceServers?: RTCIceServer[];\n /** Optional data channel label. Defaults to \"polly-mesh\". Applications\n * that share a signalling server between multiple meshes may want\n * distinct labels per mesh. */\n dataChannelLabel?: string;\n /** RTCPeerConnection constructor. Defaults to\n * `globalThis.RTCPeerConnection`. Inject a different implementation\n * (e.g. `werift` or `@roamhq/wrtc`) when running outside a browser, or\n * to use a custom subclass for tests or instrumentation. */\n RTCPeerConnection?: typeof RTCPeerConnection;\n}\n\n/** Types of signalling payload this adapter exchanges through the\n * signalling channel. The signalling server treats these as opaque. */\ntype SignalingPayload =\n | { kind: \"offer\"; sdp: RTCSessionDescriptionInit }\n | { kind: \"answer\"; sdp: RTCSessionDescriptionInit }\n | { kind: \"ice\"; candidate: RTCIceCandidateInit };\n\n/** State tracked for each remote peer. */\ninterface PeerSlot {\n connection: RTCPeerConnection;\n channel: RTCDataChannel | undefined;\n /** Outgoing messages queued while the channel is still connecting.\n * Typed as ArrayBuffer-backed so they are directly usable by\n * RTCDataChannel.send under TypeScript's strict buffer-source typing. */\n pendingSends: Uint8Array<ArrayBuffer>[];\n}\n\n/**\n * Automerge-Repo NetworkAdapter backed by real WebRTC data channels.\n * Manages one RTCPeerConnection per remote peer and uses a supplied\n * {@link MeshSignalingClient} for SDP/ICE exchange.\n */\nexport class MeshWebRTCAdapter extends NetworkAdapter {\n readonly signaling: MeshSignalingClient;\n readonly iceServers: RTCIceServer[];\n readonly dataChannelLabel: string;\n /** Peers this adapter is willing to dial. Mutable so callers that pair\n * a new device after construction (e.g. a CLI `add-device` process whose\n * mesh client is long-lived across the pair ceremony) can register the\n * new peer with {@link addKnownPeer} without restarting the client. */\n private readonly knownPeers: Set<string>;\n /** Peers currently visible in the signalling roster — populated by\n * {@link handlePeersPresent} / {@link handlePeerJoined} and pruned by\n * {@link handlePeerLeft}. Read by {@link addKnownPeer} to decide\n * whether the new peer is already online and an offer can fire now. */\n private readonly presentPeers = new Set<string>();\n /** Local peer id captured at construction time. The base\n * `NetworkAdapter.peerId` is only populated when `connect()` fires,\n * which means glare-resolution and peer-discovery dispatch would\n * otherwise have no id to compare against before the first incoming\n * message. Keeping a private mirror keeps those code paths honest\n * without depending on Automerge's lifecycle. */\n private readonly localPeerId: string;\n private readonly RTCPeerConnectionCtor: typeof RTCPeerConnection;\n private readonly slots = new Map<string, PeerSlot>();\n private ready = false;\n private readyResolver: (() => void) | undefined;\n\n /** The peers this adapter will dial. Backward-compatible read accessor\n * for callers that previously iterated the `knownPeerIds` array; the\n * underlying storage is now a Set so mutations through\n * {@link addKnownPeer} are O(1) and survive without re-allocation. */\n get knownPeerIds(): string[] {\n return [...this.knownPeers];\n }\n\n /** Callback for incoming blob messages. Set by the blob store.\n * Called with the sender's peer ID, the raw header object, and the\n * binary payload (chunk data). */\n onBlobMessage?: (peerId: string, header: Record<string, unknown>, data: Uint8Array) => void;\n\n constructor(options: MeshWebRTCAdapterOptions) {\n super();\n this.signaling = options.signaling;\n this.iceServers = options.iceServers ?? DEFAULT_ICE_SERVERS;\n this.dataChannelLabel = options.dataChannelLabel ?? \"polly-mesh\";\n this.knownPeers = new Set(options.knownPeerIds ?? []);\n this.localPeerId = options.peerId;\n const PC = options.RTCPeerConnection ?? globalThis.RTCPeerConnection;\n if (typeof PC !== \"function\") {\n throw new Error(\n \"MeshWebRTCAdapter: no RTCPeerConnection implementation found. Pass one via options.RTCPeerConnection (e.g. from `werift` or `@roamhq/wrtc`), or run in a browser where `globalThis.RTCPeerConnection` exists.\"\n );\n }\n this.RTCPeerConnectionCtor = PC;\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n /** The current number of peer slots the adapter is tracking. Each\n * slot is one ordered pair (local peer ↔ remote peer) with its own\n * RTCPeerConnection and data channel. Exposed for tests that assert\n * \"exactly one channel per pair\" after discovery settles. */\n peerSlotCount(): number {\n return this.slots.size;\n }\n\n /** Handle the signalling server's `peer-joined` notification: a new\n * peer has appeared on the relay. If the peer is in `knownPeerIds`\n * and we do not already have a slot for it, and the tie-break rule\n * designates us as the initiator (our peerId compares greater than\n * theirs), open an initiating slot and fire the SDP offer. Otherwise\n * do nothing — either we are not interested in this peer, we are\n * already connected, or the other side is the one expected to\n * initiate. */\n handlePeerJoined(remotePeerId: string): void {\n this.presentPeers.add(remotePeerId);\n if (!this.shouldInitiateTo(remotePeerId)) return;\n this.createInitiatingSlot(remotePeerId);\n }\n\n /** Handle the signalling server's `peers-present` notification sent\n * once to a newcomer. Applies the same filter as handlePeerJoined to\n * every listed peer, so a device joining into an established lobby\n * dials every knownPeer it is meant to initiate to in one pass. */\n handlePeersPresent(peerIds: string[]): void {\n for (const remotePeerId of peerIds) {\n this.presentPeers.add(remotePeerId);\n if (!this.shouldInitiateTo(remotePeerId)) continue;\n this.createInitiatingSlot(remotePeerId);\n }\n }\n\n /** Handle the signalling server's `peer-left` notification: a\n * previously joined peer has closed its socket. Evict any slot we\n * hold for that peer so a subsequent `peer-joined` from the same\n * peerId (a reconnect) creates a fresh slot rather than colliding\n * with a stale RTCPeerConnection that WebRTC's own ICE timer has\n * not yet noticed is dead. */\n handlePeerLeft(remotePeerId: string): void {\n this.presentPeers.delete(remotePeerId);\n const slot = this.slots.get(remotePeerId);\n if (!slot) return;\n slot.channel?.close();\n slot.connection.close();\n this.slots.delete(remotePeerId);\n }\n\n /** Register a peer the adapter should dial. Used by post-construction\n * pair-acceptance flows — when a long-lived mesh client (e.g. a CLI\n * `add-device` process or a daemon holding the mesh open) accepts a\n * pair token after start-up, its keyring's `knownPeers` map gains a\n * new entry. Calling this method propagates that into the adapter's\n * own allowlist; if the peer is already in the signalling roster and\n * the tie-break rule names us as the initiator, an SDP offer fires\n * immediately. No-op if the peer is already known. */\n addKnownPeer(remotePeerId: string): void {\n if (remotePeerId === this.localPeerId) return;\n if (this.knownPeers.has(remotePeerId)) return;\n this.knownPeers.add(remotePeerId);\n if (!this.presentPeers.has(remotePeerId)) return;\n if (!this.shouldInitiateTo(remotePeerId)) return;\n this.createInitiatingSlot(remotePeerId);\n }\n\n private shouldInitiateTo(remotePeerId: string): boolean {\n if (remotePeerId === this.localPeerId) return false;\n if (!this.knownPeers.has(remotePeerId)) return false;\n if (this.slots.has(remotePeerId)) return false;\n // Tie-break: the lexicographically higher peer id initiates. This\n // matches the glare-resolution rule in handleOffer, so pre-offer\n // filtering eliminates the glare pathway for the common case where\n // both sides learn of each other at roughly the same moment.\n if (this.localPeerId <= remotePeerId) return false;\n return true;\n }\n\n whenReady(): Promise<void> {\n if (this.ready) return Promise.resolve();\n return new Promise((resolve) => {\n this.readyResolver = resolve;\n });\n }\n\n /**\n * Start the adapter. Marks the adapter ready so Automerge's\n * NetworkSubsystem begins routing messages through it. Discovery of\n * peers is driven entirely by the signalling server's\n * `peers-present` and `peer-joined` frames, handed to\n * {@link handlePeersPresent} and {@link handlePeerJoined}. A peer\n * that calls `signaling.connect()` at any point — before or after\n * this method — will either find its targets already in the server's\n * lobby (peers-present) or learn about them as they arrive\n * (peer-joined); either way the adapter only opens one\n * initiating slot per ordered pair.\n */\n connect(peerId: PeerId, peerMetadata?: PeerMetadata): void {\n this.peerId = peerId;\n if (peerMetadata !== undefined) {\n this.peerMetadata = peerMetadata;\n }\n this.ready = true;\n this.readyResolver?.();\n }\n\n disconnect(): void {\n for (const slot of this.slots.values()) {\n slot.channel?.close();\n slot.connection.close();\n }\n this.slots.clear();\n this.signaling.close();\n this.ready = false;\n this.emit(\"close\");\n }\n\n /**\n * Send a sync message to a specific remote peer. If no RTCPeerConnection\n * exists yet, the adapter initiates one by producing an SDP offer and\n * sending it through the signalling channel; the outgoing bytes are\n * queued until the data channel is open.\n */\n send(message: Message): void {\n const targetId = message.targetId as unknown as string;\n const bytes = this.serialiseMessage(message);\n let slot = this.slots.get(targetId);\n if (!slot) {\n slot = this.createInitiatingSlot(targetId);\n }\n if (slot.channel && slot.channel.readyState === \"open\") {\n slot.channel.send(bytes);\n } else {\n slot.pendingSends.push(bytes);\n }\n }\n\n /**\n * Entry point the signalling client calls when it receives a signal\n * from a remote peer. Dispatches on the payload `kind` to either\n * accept an offer (building an answer), apply an answer, or add an\n * ICE candidate. Exposed publicly so the caller that constructs the\n * signalling client can wire the onSignal callback directly to this\n * method.\n */\n handleSignal(fromPeerId: string, rawPayload: unknown): void {\n const payload = rawPayload as unknown as SignalingPayload;\n if (!payload || typeof payload !== \"object\" || !(\"kind\" in payload)) {\n return;\n }\n switch (payload.kind) {\n case \"offer\":\n void this.handleOffer(fromPeerId, payload.sdp);\n return;\n case \"answer\":\n void this.handleAnswer(fromPeerId, payload.sdp);\n return;\n case \"ice\":\n void this.handleIceCandidate(fromPeerId, payload.candidate);\n return;\n }\n }\n\n private createInitiatingSlot(targetId: string): PeerSlot {\n const connection = new this.RTCPeerConnectionCtor({ iceServers: this.iceServers });\n const channel = connection.createDataChannel(this.dataChannelLabel, { ordered: true });\n const slot: PeerSlot = { connection, channel, pendingSends: [] };\n this.slots.set(targetId, slot);\n this.wireConnection(targetId, connection);\n this.wireDataChannel(targetId, channel);\n void this.initiateOffer(targetId, connection);\n return slot;\n }\n\n private async initiateOffer(targetId: string, connection: RTCPeerConnection): Promise<void> {\n const offer = await connection.createOffer();\n await connection.setLocalDescription(offer);\n this.signaling.sendSignal(targetId, { kind: \"offer\", sdp: offer } satisfies SignalingPayload);\n }\n\n private async handleOffer(fromPeerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\n const existing = this.slots.get(fromPeerId);\n if (existing) {\n // Glare: we already initiated a connection to this peer. Resolve by\n // peer-id ordering: the lexicographically lower id yields its own\n // offer and accepts the incoming one. The higher id ignores the\n // incoming offer and waits for the answer to its own.\n const localId = this.peerId as unknown as string;\n if (localId > fromPeerId) {\n return;\n }\n existing.channel?.close();\n existing.connection.close();\n this.slots.delete(fromPeerId);\n }\n\n const connection = new this.RTCPeerConnectionCtor({ iceServers: this.iceServers });\n const slot: PeerSlot = { connection, channel: undefined, pendingSends: [] };\n this.slots.set(fromPeerId, slot);\n this.wireConnection(fromPeerId, connection);\n connection.ondatachannel = (event) => {\n slot.channel = event.channel;\n this.wireDataChannel(fromPeerId, event.channel);\n };\n await connection.setRemoteDescription(sdp);\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n this.signaling.sendSignal(fromPeerId, {\n kind: \"answer\",\n sdp: answer,\n } satisfies SignalingPayload);\n }\n\n private async handleAnswer(fromPeerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n // Drop answers that arrive after the connection has already settled\n // — the signalling relay can echo a peer's frames more than once\n // under reconnect or reload, and a duplicate answer in the `stable`\n // state otherwise throws `InvalidStateError` and kills the slot. We\n // only ever expect an answer while we still have a local offer\n // pending; anything else is benign noise.\n if (slot.connection.signalingState !== \"have-local-offer\") return;\n await slot.connection.setRemoteDescription(sdp);\n }\n\n private async handleIceCandidate(\n fromPeerId: string,\n candidate: RTCIceCandidateInit\n ): Promise<void> {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n try {\n await slot.connection.addIceCandidate(candidate);\n } catch {\n // Ignore candidate errors — a stale candidate after the connection\n // has already opened is benign.\n }\n }\n\n private wireConnection(peerId: string, connection: RTCPeerConnection): void {\n connection.onicecandidate = (event) => {\n if (event.candidate) {\n this.signaling.sendSignal(peerId, {\n kind: \"ice\",\n candidate: event.candidate.toJSON(),\n } satisfies SignalingPayload);\n }\n };\n connection.onconnectionstatechange = () => {\n const state = connection.connectionState;\n if (state === \"connected\") {\n this.emit(\"peer-candidate\", {\n peerId: peerId as unknown as PeerId,\n peerMetadata: {},\n });\n } else if (state === \"disconnected\" || state === \"failed\" || state === \"closed\") {\n this.slots.delete(peerId);\n this.emit(\"peer-disconnected\", { peerId: peerId as unknown as PeerId });\n }\n };\n }\n\n private wireDataChannel(peerId: string, channel: RTCDataChannel): void {\n channel.onopen = () => {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n // Drain any pending sends that were queued while the channel\n // was still connecting.\n for (const bytes of slot.pendingSends) {\n channel.send(bytes);\n }\n slot.pendingSends = [];\n };\n channel.onmessage = (event) => {\n const data = event.data;\n if (data instanceof ArrayBuffer) {\n this.dispatchMessage(peerId, new Uint8Array(data));\n } else if (data instanceof Uint8Array) {\n this.dispatchMessage(peerId, data);\n }\n // Other types (strings, Blobs) are ignored — Polly's mesh transport\n // only sends binary payloads via this adapter.\n };\n channel.onclose = () => {\n const slot = this.slots.get(peerId);\n if (slot?.channel === channel) {\n slot.channel = undefined;\n }\n };\n }\n\n private dispatchMessage(fromPeerId: string, bytes: Uint8Array): void {\n try {\n // Intercept blob messages before they reach the Automerge deserialiser.\n // Blob headers have type fields starting with \"blob-\" and would fail\n // MeshNetworkAdapter's signed-envelope unwrap if passed through.\n if (this.onBlobMessage && isBlobMessageType(bytes)) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(4, 4 + headerLen))\n ) as Record<string, unknown>;\n const data = bytes.subarray(4 + headerLen);\n this.onBlobMessage(fromPeerId, header, data);\n return;\n }\n const message = this.deserialiseMessage(bytes);\n this.emit(\"message\", message);\n } catch {\n // Drop malformed messages silently — the MeshNetworkAdapter wrapper\n // also drops on verification failure, so a corrupt frame at this\n // layer is observationally the same as a forgery at the layer above.\n }\n }\n\n /** Peer IDs with an open data channel, suitable for blob requests. */\n get connectedPeerIds(): string[] {\n const ids: string[] = [];\n for (const [peerId, slot] of this.slots) {\n if (slot.channel && slot.channel.readyState === \"open\") {\n ids.push(peerId);\n }\n }\n return ids;\n }\n\n /** Send a pre-serialised blob message to a specific peer. Returns false\n * if the peer is not connected or the send buffer is above the high-water\n * mark (caller should retry after a delay). */\n sendBlobMessage(peerId: string, bytes: Uint8Array<ArrayBuffer>): boolean {\n const slot = this.slots.get(peerId);\n if (!slot?.channel || slot.channel.readyState !== \"open\") return false;\n return this.trySendOnChannel(slot.channel, bytes);\n }\n\n /** Send bytes on a data channel if the buffer is below the high-water\n * mark. Returns true if sent, false if backpressure applies. */\n private trySendOnChannel(channel: RTCDataChannel, bytes: Uint8Array<ArrayBuffer>): boolean {\n // 256 KiB high-water mark — matches the blob transfer default.\n if (channel.bufferedAmount > 256 * 1024) return false;\n channel.send(bytes);\n return true;\n }\n\n /** Pack an Automerge Message into binary for transmission over the\n * data channel. The format mirrors MeshNetworkAdapter's internal\n * serialisation: a length-prefixed JSON header followed by the raw\n * data bytes. Returns a Uint8Array<ArrayBuffer> so the result is\n * directly usable by RTCDataChannel.send under TypeScript's strict\n * buffer-source typing. */\n private serialiseMessage(message: Message): Uint8Array<ArrayBuffer> {\n const headerObj: Record<string, unknown> = {\n type: message.type,\n senderId: message.senderId,\n targetId: message.targetId,\n };\n if (\"documentId\" in message && message.documentId !== undefined) {\n headerObj[\"documentId\"] = message.documentId;\n }\n const headerBytes = new TextEncoder().encode(JSON.stringify(headerObj));\n const dataBytes: Uint8Array =\n \"data\" in message && message.data instanceof Uint8Array ? message.data : new Uint8Array(0);\n const size = 4 + headerBytes.length + dataBytes.length;\n const buffer = new ArrayBuffer(size);\n const out = new Uint8Array(buffer);\n const view = new DataView(buffer);\n view.setUint32(0, headerBytes.length, false);\n out.set(headerBytes, 4);\n out.set(dataBytes, 4 + headerBytes.length);\n return out;\n }\n\n /** Inverse of {@link serialiseMessage}. */\n private deserialiseMessage(bytes: Uint8Array): Message {\n if (bytes.length < 4) {\n throw new Error(\"MeshWebRTCAdapter: message too short to deserialise.\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) {\n throw new Error(\"MeshWebRTCAdapter: message header truncated.\");\n }\n const header = JSON.parse(new TextDecoder().decode(bytes.subarray(4, 4 + headerLen)));\n const data = bytes.slice(4 + headerLen);\n return { ...header, data } as unknown as Message;\n }\n}\n",
|
|
23
|
+
"/**\n * mesh-webrtc-adapter — Phase 2 browser-side WebRTC transport for Polly's\n * $meshState primitive. Extends Automerge's NetworkAdapter base class and\n * uses real native RTCPeerConnection / RTCDataChannel instances to carry\n * sync messages between peers.\n *\n * This is the \"base\" transport that MeshNetworkAdapter wraps with its\n * sign-then-encrypt envelope. The stack is:\n *\n * $meshState\n * └─ Repo\n * └─ MeshNetworkAdapter (sign + encrypt)\n * └─ MeshWebRTCAdapter (real data channels)\n * └─ MeshSignalingClient (SDP/ICE relay)\n * └─ signalingServer (Elysia plugin on the host app)\n *\n * Because WebRTC lives in browsers, this module is browser-only. It\n * assumes global RTCPeerConnection, RTCDataChannel, and WebSocket types\n * are available. Under bun:test the classes cannot be exercised\n * end-to-end — the first validation path is either Playwright running a\n * real browser, a Puppeteer harness, or a human testing a browser-side\n * example app that consumes the adapter.\n *\n * What this module does at runtime:\n *\n * - Constructs a MeshWebRTCAdapter with a signalling client and a local\n * peer id. No data channels exist at construction time.\n *\n * - When Automerge's NetworkSubsystem calls connect(peerId) on the\n * adapter, it starts listening for signals from remote peers and is\n * ready to build peer connections as they are discovered.\n *\n * - When a remote peer sends an SDP offer via the signalling channel,\n * the adapter builds a fresh RTCPeerConnection, accepts the offer,\n * produces an answer, sends it back through signalling, and wires the\n * received data channel to emit Automerge Message events upward.\n *\n * - When the local repo calls send(message), the adapter looks up the\n * peer connection for message.targetId and writes the serialised\n * bytes to its data channel. If no connection exists yet, the adapter\n * creates one by sending an SDP offer through signalling. Outgoing\n * messages are queued until the channel is open.\n *\n * - Disconnect tears down every peer connection and closes the\n * signalling client.\n */\n\nimport {\n type Message,\n NetworkAdapter,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\";\nimport { isBlobMessageType } from \"./blob-transfer\";\nimport type { MeshSignalingClient } from \"./mesh-signaling-client\";\nimport {\n chunkSyncMessage,\n isSyncFragmentType,\n parseSyncFragment,\n reassembleSyncFragments,\n SYNC_FRAGMENT_THRESHOLD,\n} from \"./sync-fragment\";\n\n/** Standard STUN servers for NAT traversal. In production, callers who\n * need TURN fallback for peers behind symmetric NATs should replace this\n * with their own ICE server list. */\nexport const DEFAULT_ICE_SERVERS: RTCIceServer[] = [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"stun:stun1.l.google.com:19302\" },\n];\n\n/** Options for constructing a {@link MeshWebRTCAdapter}. */\nexport interface MeshWebRTCAdapterOptions {\n /** The signalling client the adapter uses to exchange SDP and ICE\n * candidates with other peers. Typically constructed once per\n * application and shared across any adapters that need it. */\n signaling: MeshSignalingClient;\n /** The local peer id. Must match the peer id the signalling client\n * registered with. */\n peerId: string;\n /** Peer ids to connect to on startup. When `connect()` is called, the\n * adapter iterates this list and initiates a WebRTC connection to each\n * one by sending an SDP offer through the signalling channel. Peers\n * not in this list can still connect by sending an offer *to* this\n * adapter. The natural source for this list is the keyring's\n * knownPeers map keys. */\n knownPeerIds?: string[];\n /** Optional ICE server list override. Defaults to {@link DEFAULT_ICE_SERVERS}. */\n iceServers?: RTCIceServer[];\n /** Optional data channel label. Defaults to \"polly-mesh\". Applications\n * that share a signalling server between multiple meshes may want\n * distinct labels per mesh. */\n dataChannelLabel?: string;\n /** RTCPeerConnection constructor. Defaults to\n * `globalThis.RTCPeerConnection`. Inject a different implementation\n * (e.g. `werift` or `@roamhq/wrtc`) when running outside a browser, or\n * to use a custom subclass for tests or instrumentation. */\n RTCPeerConnection?: typeof RTCPeerConnection;\n}\n\n/** Types of signalling payload this adapter exchanges through the\n * signalling channel. The signalling server treats these as opaque. */\ntype SignalingPayload =\n | { kind: \"offer\"; sdp: RTCSessionDescriptionInit }\n | { kind: \"answer\"; sdp: RTCSessionDescriptionInit }\n | { kind: \"ice\"; candidate: RTCIceCandidateInit };\n\n/** State tracked for each remote peer. */\ninterface PeerSlot {\n connection: RTCPeerConnection;\n channel: RTCDataChannel | undefined;\n /** Outgoing messages queued while the channel is still connecting.\n * Typed as ArrayBuffer-backed so they are directly usable by\n * RTCDataChannel.send under TypeScript's strict buffer-source typing. */\n pendingSends: Uint8Array<ArrayBuffer>[];\n /** Partially-assembled inbound sync messages, keyed by the fragment id\n * stamped on each chunk. Entries are deleted as soon as the last\n * fragment for an id arrives and the reassembled bytes are dispatched. */\n pendingFragments: Map<string, { chunks: Map<number, Uint8Array>; total: number }>;\n /** Remote ICE candidates that arrived before `setRemoteDescription`\n * completed. addIceCandidate throws when `remoteDescription` is null,\n * and real Chrome 148+ does not internally queue these the way Chrome\n * for Testing does — so any candidate that wins the race against the\n * answer SDP would be silently dropped, leaving ICE checking with no\n * remote candidates to pair against. Drained from {@link handleAnswer}\n * and the post-`setRemoteDescription` step of {@link handleOffer}. */\n pendingRemoteIce: RTCIceCandidateInit[];\n}\n\n/**\n * Automerge-Repo NetworkAdapter backed by real WebRTC data channels.\n * Manages one RTCPeerConnection per remote peer and uses a supplied\n * {@link MeshSignalingClient} for SDP/ICE exchange.\n */\nexport class MeshWebRTCAdapter extends NetworkAdapter {\n readonly signaling: MeshSignalingClient;\n readonly iceServers: RTCIceServer[];\n readonly dataChannelLabel: string;\n /** Peers this adapter is willing to dial. Mutable so callers that pair\n * a new device after construction (e.g. a CLI `add-device` process whose\n * mesh client is long-lived across the pair ceremony) can register the\n * new peer with {@link addKnownPeer} without restarting the client. */\n private readonly knownPeers: Set<string>;\n /** Peers currently visible in the signalling roster — populated by\n * {@link handlePeersPresent} / {@link handlePeerJoined} and pruned by\n * {@link handlePeerLeft}. Read by {@link addKnownPeer} to decide\n * whether the new peer is already online and an offer can fire now. */\n private readonly presentPeers = new Set<string>();\n /** Local peer id captured at construction time. The base\n * `NetworkAdapter.peerId` is only populated when `connect()` fires,\n * which means glare-resolution and peer-discovery dispatch would\n * otherwise have no id to compare against before the first incoming\n * message. Keeping a private mirror keeps those code paths honest\n * without depending on Automerge's lifecycle. */\n private readonly localPeerId: string;\n private readonly RTCPeerConnectionCtor: typeof RTCPeerConnection;\n private readonly slots = new Map<string, PeerSlot>();\n private ready = false;\n private readyResolver: (() => void) | undefined;\n\n /** The peers this adapter will dial. Backward-compatible read accessor\n * for callers that previously iterated the `knownPeerIds` array; the\n * underlying storage is now a Set so mutations through\n * {@link addKnownPeer} are O(1) and survive without re-allocation. */\n get knownPeerIds(): string[] {\n return [...this.knownPeers];\n }\n\n /** Callback for incoming blob messages. Set by the blob store.\n * Called with the sender's peer ID, the raw header object, and the\n * binary payload (chunk data). */\n onBlobMessage?: (peerId: string, header: Record<string, unknown>, data: Uint8Array) => void;\n\n constructor(options: MeshWebRTCAdapterOptions) {\n super();\n this.signaling = options.signaling;\n this.iceServers = options.iceServers ?? DEFAULT_ICE_SERVERS;\n this.dataChannelLabel = options.dataChannelLabel ?? \"polly-mesh\";\n this.knownPeers = new Set(options.knownPeerIds ?? []);\n this.localPeerId = options.peerId;\n const PC = options.RTCPeerConnection ?? globalThis.RTCPeerConnection;\n if (typeof PC !== \"function\") {\n throw new Error(\n \"MeshWebRTCAdapter: no RTCPeerConnection implementation found. Pass one via options.RTCPeerConnection (e.g. from `werift` or `@roamhq/wrtc`), or run in a browser where `globalThis.RTCPeerConnection` exists.\"\n );\n }\n this.RTCPeerConnectionCtor = PC;\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n /** The current number of peer slots the adapter is tracking. Each\n * slot is one ordered pair (local peer ↔ remote peer) with its own\n * RTCPeerConnection and data channel. Exposed for tests that assert\n * \"exactly one channel per pair\" after discovery settles. */\n peerSlotCount(): number {\n return this.slots.size;\n }\n\n /** Handle the signalling server's `peer-joined` notification: a new\n * peer has appeared on the relay. If the peer is in `knownPeerIds`\n * and we do not already have a slot for it, and the tie-break rule\n * designates us as the initiator (our peerId compares greater than\n * theirs), open an initiating slot and fire the SDP offer. Otherwise\n * do nothing — either we are not interested in this peer, we are\n * already connected, or the other side is the one expected to\n * initiate. */\n handlePeerJoined(remotePeerId: string): void {\n this.presentPeers.add(remotePeerId);\n if (!this.shouldInitiateTo(remotePeerId)) return;\n this.createInitiatingSlot(remotePeerId);\n }\n\n /** Handle the signalling server's `peers-present` notification sent\n * once to a newcomer. Applies the same filter as handlePeerJoined to\n * every listed peer, so a device joining into an established lobby\n * dials every knownPeer it is meant to initiate to in one pass. */\n handlePeersPresent(peerIds: string[]): void {\n for (const remotePeerId of peerIds) {\n this.presentPeers.add(remotePeerId);\n if (!this.shouldInitiateTo(remotePeerId)) continue;\n this.createInitiatingSlot(remotePeerId);\n }\n }\n\n /** Handle the signalling server's `peer-left` notification: a\n * previously joined peer has closed its socket. Evict any slot we\n * hold for that peer so a subsequent `peer-joined` from the same\n * peerId (a reconnect) creates a fresh slot rather than colliding\n * with a stale RTCPeerConnection that WebRTC's own ICE timer has\n * not yet noticed is dead. */\n handlePeerLeft(remotePeerId: string): void {\n this.presentPeers.delete(remotePeerId);\n const slot = this.slots.get(remotePeerId);\n if (!slot) return;\n slot.channel?.close();\n slot.connection.close();\n this.slots.delete(remotePeerId);\n }\n\n /** Register a peer the adapter should dial. Used by post-construction\n * pair-acceptance flows — when a long-lived mesh client (e.g. a CLI\n * `add-device` process or a daemon holding the mesh open) accepts a\n * pair token after start-up, its keyring's `knownPeers` map gains a\n * new entry. Calling this method propagates that into the adapter's\n * own allowlist; if the peer is already in the signalling roster and\n * the tie-break rule names us as the initiator, an SDP offer fires\n * immediately. No-op if the peer is already known. */\n addKnownPeer(remotePeerId: string): void {\n if (remotePeerId === this.localPeerId) return;\n if (this.knownPeers.has(remotePeerId)) return;\n this.knownPeers.add(remotePeerId);\n if (!this.presentPeers.has(remotePeerId)) return;\n if (!this.shouldInitiateTo(remotePeerId)) return;\n this.createInitiatingSlot(remotePeerId);\n }\n\n private shouldInitiateTo(remotePeerId: string): boolean {\n if (remotePeerId === this.localPeerId) return false;\n if (!this.knownPeers.has(remotePeerId)) return false;\n if (this.slots.has(remotePeerId)) return false;\n // Tie-break: the lexicographically higher peer id initiates. This\n // matches the glare-resolution rule in handleOffer, so pre-offer\n // filtering eliminates the glare pathway for the common case where\n // both sides learn of each other at roughly the same moment.\n if (this.localPeerId <= remotePeerId) return false;\n return true;\n }\n\n whenReady(): Promise<void> {\n if (this.ready) return Promise.resolve();\n return new Promise((resolve) => {\n this.readyResolver = resolve;\n });\n }\n\n /**\n * Start the adapter. Marks the adapter ready so Automerge's\n * NetworkSubsystem begins routing messages through it. Discovery of\n * peers is driven entirely by the signalling server's\n * `peers-present` and `peer-joined` frames, handed to\n * {@link handlePeersPresent} and {@link handlePeerJoined}. A peer\n * that calls `signaling.connect()` at any point — before or after\n * this method — will either find its targets already in the server's\n * lobby (peers-present) or learn about them as they arrive\n * (peer-joined); either way the adapter only opens one\n * initiating slot per ordered pair.\n */\n connect(peerId: PeerId, peerMetadata?: PeerMetadata): void {\n this.peerId = peerId;\n if (peerMetadata !== undefined) {\n this.peerMetadata = peerMetadata;\n }\n this.ready = true;\n this.readyResolver?.();\n }\n\n disconnect(): void {\n for (const slot of this.slots.values()) {\n slot.channel?.close();\n slot.connection.close();\n }\n this.slots.clear();\n this.signaling.close();\n this.ready = false;\n this.emit(\"close\");\n }\n\n /**\n * Send a sync message to a specific remote peer. If no RTCPeerConnection\n * exists yet, the adapter initiates one by producing an SDP offer and\n * sending it through the signalling channel; the outgoing bytes are\n * queued until the data channel is open.\n */\n send(message: Message): void {\n const targetId = message.targetId as unknown as string;\n const bytes = this.serialiseMessage(message);\n let slot = this.slots.get(targetId);\n if (!slot) {\n slot = this.createInitiatingSlot(targetId);\n }\n if (slot.channel && slot.channel.readyState === \"open\") {\n this.sendBytesMaybeFragmented(slot.channel, bytes);\n } else {\n slot.pendingSends.push(bytes);\n }\n }\n\n /** Send raw wire bytes, fragmenting if they exceed the SCTP maxMessageSize\n * cap. The default RTCDataChannel limit is 256 KiB in current Chrome and\n * werift; oversized sends either throw, drop silently, or stall the\n * channel, none of which surface as an error to the caller. Fragments\n * use the same length-prefixed JSON header wire format as ordinary\n * messages but carry a `sync-fragment` type that the receive path\n * detects and reassembles before deserialising. */\n private sendBytesMaybeFragmented(channel: RTCDataChannel, bytes: Uint8Array<ArrayBuffer>): void {\n if (bytes.length <= SYNC_FRAGMENT_THRESHOLD) {\n channel.send(bytes);\n return;\n }\n const id = crypto.randomUUID();\n const fragments = chunkSyncMessage(bytes, id);\n for (const fragment of fragments) {\n channel.send(fragment);\n }\n }\n\n /**\n * Entry point the signalling client calls when it receives a signal\n * from a remote peer. Dispatches on the payload `kind` to either\n * accept an offer (building an answer), apply an answer, or add an\n * ICE candidate. Exposed publicly so the caller that constructs the\n * signalling client can wire the onSignal callback directly to this\n * method.\n */\n handleSignal(fromPeerId: string, rawPayload: unknown): void {\n const payload = rawPayload as unknown as SignalingPayload;\n if (!payload || typeof payload !== \"object\" || !(\"kind\" in payload)) {\n return;\n }\n switch (payload.kind) {\n case \"offer\":\n void this.handleOffer(fromPeerId, payload.sdp);\n return;\n case \"answer\":\n void this.handleAnswer(fromPeerId, payload.sdp);\n return;\n case \"ice\":\n void this.handleIceCandidate(fromPeerId, payload.candidate);\n return;\n }\n }\n\n private createInitiatingSlot(targetId: string): PeerSlot {\n const connection = new this.RTCPeerConnectionCtor({ iceServers: this.iceServers });\n const channel = connection.createDataChannel(this.dataChannelLabel, { ordered: true });\n const slot: PeerSlot = {\n connection,\n channel,\n pendingSends: [],\n pendingFragments: new Map(),\n pendingRemoteIce: [],\n };\n this.slots.set(targetId, slot);\n this.wireConnection(targetId, connection);\n this.wireDataChannel(targetId, channel);\n void this.initiateOffer(targetId, connection);\n return slot;\n }\n\n private async initiateOffer(targetId: string, connection: RTCPeerConnection): Promise<void> {\n const offer = await connection.createOffer();\n await connection.setLocalDescription(offer);\n this.signaling.sendSignal(targetId, { kind: \"offer\", sdp: offer } satisfies SignalingPayload);\n }\n\n private async handleOffer(fromPeerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\n const existing = this.slots.get(fromPeerId);\n if (existing) {\n // Glare: we already initiated a connection to this peer. Resolve by\n // peer-id ordering: the lexicographically lower id yields its own\n // offer and accepts the incoming one. The higher id ignores the\n // incoming offer and waits for the answer to its own.\n const localId = this.peerId as unknown as string;\n if (localId > fromPeerId) {\n return;\n }\n existing.channel?.close();\n existing.connection.close();\n this.slots.delete(fromPeerId);\n }\n\n const connection = new this.RTCPeerConnectionCtor({ iceServers: this.iceServers });\n const slot: PeerSlot = {\n connection,\n channel: undefined,\n pendingSends: [],\n pendingFragments: new Map(),\n pendingRemoteIce: [],\n };\n this.slots.set(fromPeerId, slot);\n this.wireConnection(fromPeerId, connection);\n connection.ondatachannel = (event) => {\n slot.channel = event.channel;\n this.wireDataChannel(fromPeerId, event.channel);\n };\n await connection.setRemoteDescription(sdp);\n await this.flushPendingRemoteIce(slot);\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n this.signaling.sendSignal(fromPeerId, {\n kind: \"answer\",\n sdp: answer,\n } satisfies SignalingPayload);\n }\n\n private async handleAnswer(fromPeerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n // Drop answers that arrive after the connection has already settled\n // — the signalling relay can echo a peer's frames more than once\n // under reconnect or reload, and a duplicate answer in the `stable`\n // state otherwise throws `InvalidStateError` and kills the slot. We\n // only ever expect an answer while we still have a local offer\n // pending; anything else is benign noise.\n if (slot.connection.signalingState !== \"have-local-offer\") return;\n await slot.connection.setRemoteDescription(sdp);\n await this.flushPendingRemoteIce(slot);\n }\n\n private async handleIceCandidate(\n fromPeerId: string,\n candidate: RTCIceCandidateInit\n ): Promise<void> {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n // If the answerer gathers ICE faster than its answer SDP travels\n // back through the signalling relay, candidates can land here before\n // `setRemoteDescription` has run. addIceCandidate throws when\n // `remoteDescription` is null on Chrome 148+, and the spec does not\n // require browsers to queue these internally — so buffer until the\n // remote description is set and drain in handleAnswer/handleOffer.\n if (slot.connection.remoteDescription === null) {\n slot.pendingRemoteIce.push(candidate);\n return;\n }\n try {\n await slot.connection.addIceCandidate(candidate);\n } catch {\n // Ignore candidate errors — a stale candidate after the connection\n // has already opened is benign.\n }\n }\n\n /** Drain the per-slot queue of remote ICE candidates that arrived\n * before `setRemoteDescription` completed. Errors per candidate are\n * swallowed for the same reason {@link handleIceCandidate} swallows\n * them — a single bad candidate must not stall the connection. */\n private async flushPendingRemoteIce(slot: PeerSlot): Promise<void> {\n if (slot.pendingRemoteIce.length === 0) return;\n const queued = slot.pendingRemoteIce;\n slot.pendingRemoteIce = [];\n for (const candidate of queued) {\n try {\n await slot.connection.addIceCandidate(candidate);\n } catch {\n // Same rationale as the live-path catch in handleIceCandidate.\n }\n }\n }\n\n private wireConnection(peerId: string, connection: RTCPeerConnection): void {\n connection.onicecandidate = (event) => {\n if (event.candidate) {\n this.signaling.sendSignal(peerId, {\n kind: \"ice\",\n candidate: event.candidate.toJSON(),\n } satisfies SignalingPayload);\n }\n };\n connection.onconnectionstatechange = () => {\n const state = connection.connectionState;\n if (state === \"connected\") {\n this.emit(\"peer-candidate\", {\n peerId: peerId as unknown as PeerId,\n peerMetadata: {},\n });\n } else if (state === \"disconnected\" || state === \"failed\" || state === \"closed\") {\n this.slots.delete(peerId);\n this.emit(\"peer-disconnected\", { peerId: peerId as unknown as PeerId });\n }\n };\n }\n\n private wireDataChannel(peerId: string, channel: RTCDataChannel): void {\n channel.onopen = () => {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n // Drain any pending sends that were queued while the channel\n // was still connecting. The fragmenting helper handles oversized\n // payloads the same way it would on a live send.\n for (const bytes of slot.pendingSends) {\n this.sendBytesMaybeFragmented(channel, bytes);\n }\n slot.pendingSends = [];\n };\n channel.onmessage = (event) => {\n const data = event.data;\n if (data instanceof ArrayBuffer) {\n this.dispatchMessage(peerId, new Uint8Array(data));\n } else if (data instanceof Uint8Array) {\n this.dispatchMessage(peerId, data);\n }\n // Other types (strings, Blobs) are ignored — Polly's mesh transport\n // only sends binary payloads via this adapter.\n };\n channel.onclose = () => {\n const slot = this.slots.get(peerId);\n if (slot?.channel === channel) {\n slot.channel = undefined;\n }\n };\n }\n\n private dispatchMessage(fromPeerId: string, bytes: Uint8Array): void {\n try {\n // Intercept sync-fragments first: an oversized Automerge sync\n // message is split into fragments on the sender side because a\n // single RTCDataChannel.send above the SCTP maxMessageSize cap\n // silently drops or stalls the channel. Reassemble and re-dispatch\n // once every fragment of an id has arrived.\n if (isSyncFragmentType(bytes)) {\n this.handleSyncFragment(fromPeerId, bytes);\n return;\n }\n // Intercept blob messages before they reach the Automerge deserialiser.\n // Blob headers have type fields starting with \"blob-\" and would fail\n // MeshNetworkAdapter's signed-envelope unwrap if passed through.\n if (this.onBlobMessage && isBlobMessageType(bytes)) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(4, 4 + headerLen))\n ) as Record<string, unknown>;\n const data = bytes.subarray(4 + headerLen);\n this.onBlobMessage(fromPeerId, header, data);\n return;\n }\n const message = this.deserialiseMessage(bytes);\n this.emit(\"message\", message);\n } catch {\n // Drop malformed messages silently — the MeshNetworkAdapter wrapper\n // also drops on verification failure, so a corrupt frame at this\n // layer is observationally the same as a forgery at the layer above.\n }\n }\n\n private handleSyncFragment(fromPeerId: string, bytes: Uint8Array): void {\n const parsed = parseSyncFragment(bytes);\n if (!parsed) return;\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n const { header, data } = parsed;\n let entry = slot.pendingFragments.get(header.id);\n if (!entry) {\n entry = { chunks: new Map(), total: header.total };\n slot.pendingFragments.set(header.id, entry);\n }\n // The data view is a window onto the wire frame buffer. Copy out so\n // the reassembled message owns its bytes and the wire frame can be\n // garbage-collected.\n entry.chunks.set(header.index, data.slice());\n if (entry.chunks.size < entry.total) return;\n slot.pendingFragments.delete(header.id);\n const reassembled = reassembleSyncFragments(entry.chunks, entry.total);\n this.dispatchMessage(fromPeerId, reassembled);\n }\n\n /** Peer IDs with an open data channel, suitable for blob requests. */\n get connectedPeerIds(): string[] {\n const ids: string[] = [];\n for (const [peerId, slot] of this.slots) {\n if (slot.channel && slot.channel.readyState === \"open\") {\n ids.push(peerId);\n }\n }\n return ids;\n }\n\n /** Send a pre-serialised blob message to a specific peer. Returns false\n * if the peer is not connected or the send buffer is above the high-water\n * mark (caller should retry after a delay). */\n sendBlobMessage(peerId: string, bytes: Uint8Array<ArrayBuffer>): boolean {\n const slot = this.slots.get(peerId);\n if (!slot?.channel || slot.channel.readyState !== \"open\") return false;\n return this.trySendOnChannel(slot.channel, bytes);\n }\n\n /** Send bytes on a data channel if the buffer is below the high-water\n * mark. Returns true if sent, false if backpressure applies. */\n private trySendOnChannel(channel: RTCDataChannel, bytes: Uint8Array<ArrayBuffer>): boolean {\n // 256 KiB high-water mark — matches the blob transfer default.\n if (channel.bufferedAmount > 256 * 1024) return false;\n channel.send(bytes);\n return true;\n }\n\n /** Pack an Automerge Message into binary for transmission over the\n * data channel. The format mirrors MeshNetworkAdapter's internal\n * serialisation: a length-prefixed JSON header followed by the raw\n * data bytes. Returns a Uint8Array<ArrayBuffer> so the result is\n * directly usable by RTCDataChannel.send under TypeScript's strict\n * buffer-source typing. */\n private serialiseMessage(message: Message): Uint8Array<ArrayBuffer> {\n const headerObj: Record<string, unknown> = {\n type: message.type,\n senderId: message.senderId,\n targetId: message.targetId,\n };\n if (\"documentId\" in message && message.documentId !== undefined) {\n headerObj[\"documentId\"] = message.documentId;\n }\n const headerBytes = new TextEncoder().encode(JSON.stringify(headerObj));\n const dataBytes: Uint8Array =\n \"data\" in message && message.data instanceof Uint8Array ? message.data : new Uint8Array(0);\n const size = 4 + headerBytes.length + dataBytes.length;\n const buffer = new ArrayBuffer(size);\n const out = new Uint8Array(buffer);\n const view = new DataView(buffer);\n view.setUint32(0, headerBytes.length, false);\n out.set(headerBytes, 4);\n out.set(dataBytes, 4 + headerBytes.length);\n return out;\n }\n\n /** Inverse of {@link serialiseMessage}. */\n private deserialiseMessage(bytes: Uint8Array): Message {\n if (bytes.length < 4) {\n throw new Error(\"MeshWebRTCAdapter: message too short to deserialise.\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) {\n throw new Error(\"MeshWebRTCAdapter: message header truncated.\");\n }\n const header = JSON.parse(new TextDecoder().decode(bytes.subarray(4, 4 + headerLen)));\n const data = bytes.slice(4 + headerLen);\n return { ...header, data } as unknown as Message;\n }\n}\n",
|
|
24
|
+
"/**\n * sync-fragment — chunking, reassembly, and wire format for oversized\n * Automerge sync messages sent through MeshWebRTCAdapter.\n *\n * An `RTCDataChannel.send(bytes)` call with a payload above the SCTP\n * `maxMessageSize` limit (256 KiB by default in Chrome and werift) either\n * throws synchronously, drops silently, or stalls the channel — none of\n * which are observable to the caller. A first-connection Automerge sync\n * for a doc whose state exceeds ~200 KiB produces exactly such a message,\n * so without fragmentation the receiver's `dc.onmessage` never fires for\n * the large payload and sync stalls forever.\n *\n * The wire format here mirrors the blob-transfer layout — a 4-byte\n * big-endian header length followed by a JSON header and the chunk\n * payload — but uses a distinct `type` value (`sync-fragment`, no\n * `blob-` prefix) so the existing blob fast-path in MeshWebRTCAdapter\n * does not mistake a sync fragment for a blob chunk.\n */\n\n/** Maximum bytes a single channel.send may carry without fragmentation.\n * Chosen well below the 256 KiB SCTP cap so the framing header for a\n * single chunk cannot push the wire frame over the limit. Matches the\n * blob-transfer chunk size so the two transports have a consistent\n * per-message footprint on the data channel. */\nexport const SYNC_FRAGMENT_THRESHOLD = 64 * 1024;\n\n/** Chunk size used when a message exceeds the threshold. */\nexport const SYNC_FRAGMENT_CHUNK_SIZE = 64 * 1024;\n\nexport interface SyncFragmentHeader {\n type: \"sync-fragment\";\n /** Identifier shared by every fragment of one original message. */\n id: string;\n /** Zero-based fragment index within the message. */\n index: number;\n /** Total number of fragments composing the message. */\n total: number;\n}\n\n/** Wire frame for a sync fragment: 4-byte BE header length, JSON header,\n * raw chunk bytes. Returned as an ArrayBuffer-backed Uint8Array so it is\n * directly usable by RTCDataChannel.send under strict buffer-source typing. */\nexport function serialiseSyncFragment(\n header: SyncFragmentHeader,\n data: Uint8Array\n): Uint8Array<ArrayBuffer> {\n const headerBytes = new TextEncoder().encode(JSON.stringify(header));\n const size = 4 + headerBytes.length + data.length;\n const buffer = new ArrayBuffer(size);\n const out = new Uint8Array(buffer);\n const view = new DataView(buffer);\n view.setUint32(0, headerBytes.length, false);\n out.set(headerBytes, 4);\n out.set(data, 4 + headerBytes.length);\n return out;\n}\n\n/** Parse a wire frame produced by {@link serialiseSyncFragment}. Returns\n * undefined if the bytes are too short, the header is unparseable, or the\n * header `type` is not `sync-fragment`. */\nexport function parseSyncFragment(\n bytes: Uint8Array\n): { header: SyncFragmentHeader; data: Uint8Array } | undefined {\n if (bytes.length < 4) return undefined;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) return undefined;\n try {\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(4, 4 + headerLen))\n ) as SyncFragmentHeader;\n if (header.type !== \"sync-fragment\") return undefined;\n const data = bytes.subarray(4 + headerLen);\n return { header, data };\n } catch {\n return undefined;\n }\n}\n\n/** Cheap probe used on the receive path before parsing — looks for the\n * literal `\"type\":\"sync-fragment\"` byte sequence inside the JSON header\n * without a full parse. Mirrors `isBlobMessageType`. */\nexport function isSyncFragmentType(bytes: Uint8Array): boolean {\n if (bytes.length < 4) return false;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) return false;\n const headerSlice = bytes.subarray(4, 4 + headerLen);\n const needle = new TextEncoder().encode('\"type\":\"sync-fragment\"');\n return findSubarray(headerSlice, needle) !== -1;\n}\n\n/** Split a serialised sync message into ordered fragments suitable for\n * transmission through one data channel. The caller is responsible for\n * generating the shared `id`. Always returns at least one fragment, so\n * callers can use it unconditionally without a separate small-message\n * branch — though MeshWebRTCAdapter shortcuts the small-message case to\n * avoid the per-chunk header overhead. */\nexport function chunkSyncMessage(\n bytes: Uint8Array,\n id: string,\n chunkSize: number = SYNC_FRAGMENT_CHUNK_SIZE\n): Uint8Array<ArrayBuffer>[] {\n const total = Math.max(1, Math.ceil(bytes.length / chunkSize));\n const fragments: Uint8Array<ArrayBuffer>[] = [];\n for (let index = 0; index < total; index++) {\n const start = index * chunkSize;\n const end = Math.min(start + chunkSize, bytes.length);\n fragments.push(\n serialiseSyncFragment({ type: \"sync-fragment\", id, index, total }, bytes.subarray(start, end))\n );\n }\n return fragments;\n}\n\n/** Reassemble a complete fragment map into the original byte sequence.\n * Throws if any index in [0, total) is missing. */\nexport function reassembleSyncFragments(\n chunks: Map<number, Uint8Array>,\n total: number\n): Uint8Array {\n let totalBytes = 0;\n for (let i = 0; i < total; i++) {\n const chunk = chunks.get(i);\n if (!chunk) {\n throw new Error(`reassembleSyncFragments: missing fragment ${i} of ${total}`);\n }\n totalBytes += chunk.length;\n }\n const out = new Uint8Array(totalBytes);\n let offset = 0;\n for (let i = 0; i < total; i++) {\n const chunk = chunks.get(i) as unknown as Uint8Array;\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nfunction findSubarray(haystack: Uint8Array, needle: Uint8Array): number {\n if (needle.length === 0) return 0;\n outer: for (let i = 0; i <= haystack.length - needle.length; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (haystack[i + j] !== needle[j]) continue outer;\n }\n return i;\n }\n return -1;\n}\n",
|
|
24
25
|
"/**\n * pairing — Phase 2 first-cut pairing flow for $meshState.\n *\n * Two devices that want to share a $meshState document must exchange three\n * things before sync can begin: the issuer's Ed25519 signing public key\n * (so the receiver can verify ops authored by the issuer), the symmetric\n * document encryption key (so both sides can encrypt and decrypt the\n * shared document), and the issuer's stable peer id (so the receiver\n * knows which entry in its keyring the public key belongs to). This\n * module packs all three into a {@link PairingToken}, serialises it to a\n * compact binary format suitable for QR codes or copy-paste, and provides\n * the matching parse-and-apply flow on the receiving side.\n *\n * Threat model: pairing tokens are transmitted over an out-of-band channel\n * that the user can authenticate visually — typically a QR code on the\n * issuer's device, scanned by the receiver. Because anyone with the token\n * can decrypt and impersonate, the OOB channel is the only authentication.\n * The token includes a TTL (default 10 minutes) so that a token displayed\n * briefly and then dismissed cannot be replayed by an attacker who later\n * gains access to a screenshot. A production deployment would layer a\n * Short Authentication String (SAS) on top — both devices display a code\n * derived from the shared state, and the user verifies they match — but\n * that is a follow-up.\n *\n * The pairing flow is one-way in the Phase 2 first cut. The issuer\n * generates a token and displays it; the receiver applies it and picks\n * up the issuer's keys. The receiver's own keys reach the issuer through\n * the access set: when the receiver sends its first signed op, the issuer\n * records the receiver's public key alongside its peer id and adds it to\n * the keyring. A bidirectional pairing flow that exchanges both sides'\n * keys in a single QR exchange is straightforward to add later but adds\n * UX surface area that is not needed for the mesh transport to work.\n */\n\nimport { KEY_BYTES as ENCRYPTION_KEY_BYTES, generateDocumentKey } from \"./encryption\";\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport {\n generateSigningKeyPair,\n PUBLIC_KEY_BYTES as SIGNING_PUBLIC_KEY_BYTES,\n type SigningKeyPair,\n} from \"./signing\";\n\n/** Current pairing-token format version. Bumped if the wire format changes. */\nexport const PAIRING_TOKEN_VERSION = 1;\n\n/** Magic header bytes for sanity-checking parsed tokens. ASCII \"PPT1\". */\nexport const PAIRING_TOKEN_MAGIC = new Uint8Array([0x50, 0x50, 0x54, 0x31]);\n\n/** Length of the random nonce embedded in every token. */\nexport const PAIRING_NONCE_BYTES = 16;\n\n/** Default TTL applied when {@link createPairingToken} is called without an\n * explicit `ttlMs` option. */\nexport const DEFAULT_PAIRING_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\n/**\n * The contents of a pairing token. Both sides operate on this shape; the\n * binary serialisation is purely for transport.\n */\nexport interface PairingToken {\n /** Format version. {@link PAIRING_TOKEN_VERSION} at the time of writing. */\n version: number;\n /** Stable peer id of the issuing device. The receiver records this as\n * the lookup key for the issuer's public key in its keyring. */\n issuerPeerId: string;\n /** Issuer's Ed25519 signing public key (32 bytes). */\n issuerPublicKey: Uint8Array;\n /** Shared document encryption key (32 bytes). The receiver stores this\n * under {@link documentKeyId} in its keyring. */\n documentKey: Uint8Array;\n /** Identifier under which the receiver stores the document key. For the\n * Phase 2 first cut this is typically the well-known DEFAULT_MESH_KEY_ID\n * from mesh-network-adapter; per-document keys (one entry per Automerge\n * document) are a follow-up. */\n documentKeyId: string;\n /** Unix timestamp (milliseconds) after which the token is considered\n * expired and {@link applyPairingToken} refuses to use it. */\n expiresAt: number;\n /** 16-byte random nonce. Carried through serialisation so two tokens\n * with otherwise-identical contents are still distinguishable. */\n nonce: Uint8Array;\n}\n\n/** Errors thrown by the pairing subsystem. */\nexport class PairingError extends Error {\n readonly code:\n | \"expired\"\n | \"wrong-magic\"\n | \"unknown-version\"\n | \"truncated\"\n | \"invalid-public-key\"\n | \"invalid-document-key\"\n | \"invalid-nonce\";\n\n constructor(message: string, code: PairingError[\"code\"]) {\n super(message);\n this.name = \"PairingError\";\n this.code = code;\n }\n}\n\n/**\n * Options for {@link createPairingToken}. The signing identity and the\n * document key are required; everything else is optional with sensible\n * defaults.\n */\nexport interface CreatePairingTokenOptions {\n /** The issuing device's signing keypair. Only the public key ends up in\n * the token; the secret never leaves the issuer. */\n identity: SigningKeyPair;\n /** Stable peer id for the issuing device. */\n issuerPeerId: string;\n /** The symmetric document key the receiver should adopt. If omitted, a\n * fresh key is generated and the caller is responsible for using the\n * same key on the issuing side too. */\n documentKey?: Uint8Array;\n /** Identifier under which the receiver stores the document key. */\n documentKeyId: string;\n /** Time-to-live in milliseconds. Defaults to {@link DEFAULT_PAIRING_TTL_MS}. */\n ttlMs?: number;\n /** Override the current time. Intended for tests; production code should\n * not pass this. */\n now?: () => number;\n}\n\n/**\n * Generate a fresh {@link PairingToken}. The token is ready to be\n * serialised and displayed to the receiver via an OOB channel.\n */\nexport function createPairingToken(options: CreatePairingTokenOptions): PairingToken {\n const now = options.now ? options.now() : Date.now();\n const ttlMs = options.ttlMs ?? DEFAULT_PAIRING_TTL_MS;\n const documentKey = options.documentKey ?? generateDocumentKey();\n const nonce = randomBytes(PAIRING_NONCE_BYTES);\n\n return {\n version: PAIRING_TOKEN_VERSION,\n issuerPeerId: options.issuerPeerId,\n issuerPublicKey: options.identity.publicKey,\n documentKey,\n documentKeyId: options.documentKeyId,\n expiresAt: now + ttlMs,\n nonce,\n };\n}\n\n/**\n * Generate a fresh pairing token *and* a fresh signing keypair in one call.\n * Convenience for first-time setup where the device has no existing\n * identity yet. Returns both so the caller can persist the keypair and\n * then display the token.\n */\nexport function createPairingTokenWithFreshIdentity(args: {\n issuerPeerId: string;\n documentKeyId: string;\n ttlMs?: number;\n now?: () => number;\n}): { identity: SigningKeyPair; token: PairingToken } {\n const identity = generateSigningKeyPair();\n const token = createPairingToken({\n identity,\n issuerPeerId: args.issuerPeerId,\n documentKeyId: args.documentKeyId,\n ttlMs: args.ttlMs,\n now: args.now,\n });\n return { identity, token };\n}\n\n/**\n * Check whether a token has expired against the current wall-clock time\n * (or an injected `now`).\n */\nexport function isPairingTokenExpired(token: PairingToken, now?: () => number): boolean {\n const t = now ? now() : Date.now();\n return t >= token.expiresAt;\n}\n\n/**\n * Apply a parsed and validated token to a {@link MeshKeyring}. Mutates the\n * keyring in place: adds the issuer's public key to {@link MeshKeyring.knownPeers}\n * and the document key to {@link MeshKeyring.documentKeys}.\n *\n * Throws {@link PairingError} with code \"expired\" if the token's TTL has\n * elapsed. The receiver is expected to apply the token promptly after\n * scanning; rejecting expired tokens prevents replay of long-lived\n * captures.\n */\nexport function applyPairingToken(\n token: PairingToken,\n keyring: MeshKeyring,\n options: { now?: () => number } = {}\n): void {\n if (isPairingTokenExpired(token, options.now)) {\n throw new PairingError(\n `Pairing token from ${token.issuerPeerId} expired at ${new Date(token.expiresAt).toISOString()}.`,\n \"expired\"\n );\n }\n keyring.knownPeers.set(token.issuerPeerId, token.issuerPublicKey);\n keyring.documentKeys.set(token.documentKeyId, token.documentKey);\n}\n\n// binary serialisation\n\n/**\n * Serialise a token to a binary blob. The wire format is:\n *\n * [4 bytes: magic \"PPT1\"]\n * [1 byte: version]\n * [4 bytes BE: issuer id byte length]\n * [N bytes: issuer id UTF-8]\n * [32 bytes: issuer public key]\n * [32 bytes: document key]\n * [4 bytes BE: document key id byte length]\n * [M bytes: document key id UTF-8]\n * [8 bytes BE: expiresAt (uint64 milliseconds)]\n * [16 bytes: nonce]\n *\n * Use {@link encodePairingToken} to round-trip through a base64 string.\n */\nexport function serialisePairingToken(token: PairingToken): Uint8Array {\n validateForSerialisation(token);\n const issuerBytes = new TextEncoder().encode(token.issuerPeerId);\n const keyIdBytes = new TextEncoder().encode(token.documentKeyId);\n\n const total =\n PAIRING_TOKEN_MAGIC.length +\n 1 + // version\n 4 + // issuer id length\n issuerBytes.length +\n SIGNING_PUBLIC_KEY_BYTES +\n ENCRYPTION_KEY_BYTES +\n 4 + // doc key id length\n keyIdBytes.length +\n 8 + // expiresAt\n PAIRING_NONCE_BYTES;\n\n const out = new Uint8Array(total);\n let offset = 0;\n\n out.set(PAIRING_TOKEN_MAGIC, offset);\n offset += PAIRING_TOKEN_MAGIC.length;\n\n out[offset] = token.version;\n offset += 1;\n\n const view = new DataView(out.buffer);\n view.setUint32(offset, issuerBytes.length, false);\n offset += 4;\n out.set(issuerBytes, offset);\n offset += issuerBytes.length;\n\n out.set(token.issuerPublicKey, offset);\n offset += SIGNING_PUBLIC_KEY_BYTES;\n\n out.set(token.documentKey, offset);\n offset += ENCRYPTION_KEY_BYTES;\n\n view.setUint32(offset, keyIdBytes.length, false);\n offset += 4;\n out.set(keyIdBytes, offset);\n offset += keyIdBytes.length;\n\n // Write expiresAt as uint64 BE. JavaScript numbers are float64 but the\n // value is an integer count of milliseconds, well within 53-bit safe\n // range for any practical timestamp.\n view.setBigUint64(offset, BigInt(token.expiresAt), false);\n offset += 8;\n\n out.set(token.nonce, offset);\n offset += PAIRING_NONCE_BYTES;\n\n return out;\n}\n\n/**\n * Inverse of {@link serialisePairingToken}. Throws {@link PairingError} on\n * malformed input.\n */\nexport function parsePairingToken(bytes: Uint8Array): PairingToken {\n let offset = 0;\n\n // Magic\n if (bytes.length < PAIRING_TOKEN_MAGIC.length) {\n throw new PairingError(`Pairing token too short: ${bytes.length} bytes.`, \"truncated\");\n }\n for (let i = 0; i < PAIRING_TOKEN_MAGIC.length; i++) {\n if (bytes[offset + i] !== PAIRING_TOKEN_MAGIC[i]) {\n throw new PairingError(\n `Pairing token magic mismatch: not a Polly pairing token.`,\n \"wrong-magic\"\n );\n }\n }\n offset += PAIRING_TOKEN_MAGIC.length;\n\n // Version\n if (bytes.length < offset + 1) {\n throw new PairingError(\"Pairing token truncated at version.\", \"truncated\");\n }\n const version = bytes[offset] as unknown as number;\n offset += 1;\n if (version !== PAIRING_TOKEN_VERSION) {\n throw new PairingError(\n `Unknown pairing token version: ${version}. This Polly build supports version ${PAIRING_TOKEN_VERSION}.`,\n \"unknown-version\"\n );\n }\n\n // Issuer id\n if (bytes.length < offset + 4) {\n throw new PairingError(\"Pairing token truncated at issuer id length.\", \"truncated\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const issuerLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + issuerLen) {\n throw new PairingError(\"Pairing token truncated at issuer id.\", \"truncated\");\n }\n const issuerPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + issuerLen));\n offset += issuerLen;\n\n // Issuer public key\n if (bytes.length < offset + SIGNING_PUBLIC_KEY_BYTES) {\n throw new PairingError(\"Pairing token truncated at public key.\", \"truncated\");\n }\n const issuerPublicKey = bytes.slice(offset, offset + SIGNING_PUBLIC_KEY_BYTES);\n offset += SIGNING_PUBLIC_KEY_BYTES;\n\n // Document key\n if (bytes.length < offset + ENCRYPTION_KEY_BYTES) {\n throw new PairingError(\"Pairing token truncated at document key.\", \"truncated\");\n }\n const documentKey = bytes.slice(offset, offset + ENCRYPTION_KEY_BYTES);\n offset += ENCRYPTION_KEY_BYTES;\n\n // Document key id\n if (bytes.length < offset + 4) {\n throw new PairingError(\"Pairing token truncated at document key id length.\", \"truncated\");\n }\n const keyIdLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + keyIdLen) {\n throw new PairingError(\"Pairing token truncated at document key id.\", \"truncated\");\n }\n const documentKeyId = new TextDecoder().decode(bytes.subarray(offset, offset + keyIdLen));\n offset += keyIdLen;\n\n // Expires at\n if (bytes.length < offset + 8) {\n throw new PairingError(\"Pairing token truncated at expiry.\", \"truncated\");\n }\n const expiresAtBig = view.getBigUint64(offset, false);\n offset += 8;\n const expiresAt = Number(expiresAtBig);\n\n // Nonce\n if (bytes.length < offset + PAIRING_NONCE_BYTES) {\n throw new PairingError(\"Pairing token truncated at nonce.\", \"truncated\");\n }\n const nonce = bytes.slice(offset, offset + PAIRING_NONCE_BYTES);\n offset += PAIRING_NONCE_BYTES;\n\n return {\n version,\n issuerPeerId,\n issuerPublicKey,\n documentKey,\n documentKeyId,\n expiresAt,\n nonce,\n };\n}\n\n/**\n * Serialise a token and base64-encode it for QR-code or copy-paste display.\n * The encoding uses the standard base64 alphabet (not URL-safe) because\n * QR codes encode bytes directly and do not care about URL safety.\n */\nexport function encodePairingToken(token: PairingToken): string {\n const bytes = serialisePairingToken(token);\n // btoa expects a binary string. Convert via String.fromCharCode per byte;\n // safe for the ~150-byte token size and avoids the spread-into-fromCharCode\n // pattern that runs into argument-count limits on large arrays.\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\n/**\n * Decode a base64-encoded pairing token produced by {@link encodePairingToken}.\n * Throws {@link PairingError} on malformed input.\n */\nexport function decodePairingToken(encoded: string): PairingToken {\n let binary: string;\n try {\n binary = atob(encoded);\n } catch {\n throw new PairingError(\"Pairing token is not valid base64.\", \"wrong-magic\");\n }\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return parsePairingToken(bytes);\n}\n\n// helpers\n\nfunction validateForSerialisation(token: PairingToken): void {\n if (token.issuerPublicKey.length !== SIGNING_PUBLIC_KEY_BYTES) {\n throw new PairingError(\n `Issuer public key must be ${SIGNING_PUBLIC_KEY_BYTES} bytes, got ${token.issuerPublicKey.length}.`,\n \"invalid-public-key\"\n );\n }\n if (token.documentKey.length !== ENCRYPTION_KEY_BYTES) {\n throw new PairingError(\n `Document key must be ${ENCRYPTION_KEY_BYTES} bytes, got ${token.documentKey.length}.`,\n \"invalid-document-key\"\n );\n }\n if (token.nonce.length !== PAIRING_NONCE_BYTES) {\n throw new PairingError(\n `Nonce must be ${PAIRING_NONCE_BYTES} bytes, got ${token.nonce.length}.`,\n \"invalid-nonce\"\n );\n }\n}\n\nfunction randomBytes(n: number): Uint8Array {\n const out = new Uint8Array(n);\n crypto.getRandomValues(out);\n return out;\n}\n",
|
|
25
26
|
"/**\n * revocation — Phase 2 key-revocation flow for $meshState.\n *\n * A $meshState deployment is only as secure as the keys it trusts. When a\n * device is lost, stolen, or compromised, its public key needs to be\n * removed from every other peer's trust set so that any operations signed\n * by that key are refused. This module provides the primitive pieces for\n * that flow: a signed revocation record that names the revoked peer id,\n * carries the issuer's identity, and travels between peers through the\n * same channels as any other signed message.\n *\n * A RevocationRecord is produced by a peer that has decided to revoke\n * another peer (typically because the user told their device to do so).\n * It is then serialised to a binary envelope, broadcast to other peers\n * through whatever transport is available, and applied to each receiving\n * keyring via {@link applyRevocation}. Applying a revocation adds the\n * target peer id to the keyring's {@link MeshKeyring.revokedPeers} set;\n * the MeshNetworkAdapter then drops all further messages from that peer,\n * even though the public key is still present in the knownPeers map.\n *\n * Signature layer: every revocation is signed by the *issuer's* key. The\n * receiver verifies the signature against the issuer's public key before\n * applying. This prevents a peer with no authority from forging a\n * revocation, at least in the signature-level threat model — a compromised\n * peer could still forge revocations naming any other peer, which is why\n * production deployments layer an access-set check on top (\"who is\n * authorised to revoke whom\"). That layer is a follow-up; the first cut\n * is signature-only, and any signed revocation from a known peer is\n * accepted.\n *\n * Why revocations are signed but not encrypted: revocations are public\n * in the sense that they name \"peer X is no longer trusted.\" There is no\n * confidentiality requirement — anyone seeing a revocation learns only\n * that someone has been kicked out, which is already observable from\n * the absence of their operations. Encrypting them would add cost without\n * adding security, so the wire format is signed-only.\n */\n\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport {\n decodeSignedEnvelope,\n encodeSignedEnvelope,\n openEnvelope as openSignedEnvelope,\n type SigningKeyPair,\n signEnvelope,\n} from \"./signing\";\n\n/** Current revocation-record format version. */\nexport const REVOCATION_RECORD_VERSION = 1;\n\n/** Magic header bytes for sanity-checking parsed revocations. ASCII \"PRV1\". */\nexport const REVOCATION_MAGIC = new Uint8Array([0x50, 0x52, 0x56, 0x31]);\n\n/**\n * The payload carried inside a signed revocation envelope.\n */\nexport interface RevocationRecord {\n /** Format version. */\n version: number;\n /** The peer id doing the revoking. Becomes the `senderId` of the signed\n * envelope when the record is serialised. */\n issuerPeerId: string;\n /** The peer id being revoked. After a receiver applies this record, its\n * MeshNetworkAdapter will drop all further messages from this peer. */\n revokedPeerId: string;\n /** Unix timestamp (milliseconds) when the revocation was issued. Carried\n * for audit and for tie-breaking in case an issuer issues multiple\n * revocations targeting the same peer. */\n issuedAt: number;\n /** Optional human-readable reason. Not used by the enforcement layer;\n * applications can surface it in audit logs. */\n reason?: string;\n}\n\n/** Errors thrown by the revocation subsystem. */\nexport class RevocationError extends Error {\n readonly code:\n | \"unknown-issuer\"\n | \"unauthorised-issuer\"\n | \"signature-invalid\"\n | \"truncated\"\n | \"wrong-magic\"\n | \"unknown-version\"\n | \"not-signed-by-issuer\";\n\n constructor(message: string, code: RevocationError[\"code\"]) {\n super(message);\n this.name = \"RevocationError\";\n this.code = code;\n }\n}\n\n/** Options for {@link createRevocation}. */\nexport interface CreateRevocationOptions {\n /** Signing keypair of the issuer. The private key signs the record; the\n * public key is looked up by the receiver via `issuerPeerId`. */\n issuer: SigningKeyPair;\n /** Stable peer id of the issuer. */\n issuerPeerId: string;\n /** Peer id to revoke. */\n revokedPeerId: string;\n /** Optional human-readable reason. */\n reason?: string;\n /** Override the current time. Intended for tests. */\n now?: () => number;\n}\n\n/**\n * Build a fresh {@link RevocationRecord}. The returned record is plain\n * data; use {@link encodeRevocation} to wrap it in a signed envelope\n * suitable for transport.\n */\nexport function createRevocation(options: CreateRevocationOptions): RevocationRecord {\n const now = options.now ? options.now() : Date.now();\n return {\n version: REVOCATION_RECORD_VERSION,\n issuerPeerId: options.issuerPeerId,\n revokedPeerId: options.revokedPeerId,\n issuedAt: now,\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n };\n}\n\n/**\n * Apply a verified revocation to a keyring. Mutates the keyring in place:\n * adds the target peer id to {@link MeshKeyring.revokedPeers}. The caller\n * must verify the revocation (via {@link decodeRevocation}) before\n * applying; this function does not revalidate the signature.\n */\nexport function applyRevocation(record: RevocationRecord, keyring: MeshKeyring): void {\n keyring.revokedPeers.add(record.revokedPeerId);\n}\n\n/**\n * Revoke a peer locally without producing a transportable record. Useful\n * for the common case where an application decides to drop a peer on this\n * device without propagating the decision elsewhere (tests, single-device\n * setups). Peers that want the revocation to spread to other devices\n * should use {@link createRevocation} + {@link encodeRevocation}.\n */\nexport function revokePeerLocally(peerId: string, keyring: MeshKeyring): void {\n keyring.revokedPeers.add(peerId);\n}\n\n// binary serialisation\n\n/**\n * Serialise a {@link RevocationRecord} to a binary payload ready for\n * signing. The layout is:\n *\n * [4 bytes: magic \"PRV1\"]\n * [1 byte: version]\n * [4 bytes BE: issuer id byte length]\n * [N bytes: issuer id UTF-8]\n * [4 bytes BE: revoked peer id byte length]\n * [M bytes: revoked peer id UTF-8]\n * [8 bytes BE: issuedAt (uint64 milliseconds)]\n * [4 bytes BE: reason byte length]\n * [R bytes: reason UTF-8]\n */\nexport function serialiseRevocationPayload(record: RevocationRecord): Uint8Array {\n const issuerBytes = new TextEncoder().encode(record.issuerPeerId);\n const revokedBytes = new TextEncoder().encode(record.revokedPeerId);\n const reasonBytes = new TextEncoder().encode(record.reason ?? \"\");\n\n const total =\n REVOCATION_MAGIC.length +\n 1 + // version\n 4 +\n issuerBytes.length +\n 4 +\n revokedBytes.length +\n 8 + // issuedAt\n 4 +\n reasonBytes.length;\n\n const out = new Uint8Array(total);\n let offset = 0;\n\n out.set(REVOCATION_MAGIC, offset);\n offset += REVOCATION_MAGIC.length;\n\n out[offset] = record.version;\n offset += 1;\n\n const view = new DataView(out.buffer);\n view.setUint32(offset, issuerBytes.length, false);\n offset += 4;\n out.set(issuerBytes, offset);\n offset += issuerBytes.length;\n\n view.setUint32(offset, revokedBytes.length, false);\n offset += 4;\n out.set(revokedBytes, offset);\n offset += revokedBytes.length;\n\n view.setBigUint64(offset, BigInt(record.issuedAt), false);\n offset += 8;\n\n view.setUint32(offset, reasonBytes.length, false);\n offset += 4;\n out.set(reasonBytes, offset);\n\n return out;\n}\n\n/** Inverse of {@link serialiseRevocationPayload}. */\nfunction parseRevocationPayload(bytes: Uint8Array): RevocationRecord {\n let offset = 0;\n\n if (bytes.length < REVOCATION_MAGIC.length) {\n throw new RevocationError(\"Revocation record too short for magic.\", \"truncated\");\n }\n for (let i = 0; i < REVOCATION_MAGIC.length; i++) {\n if (bytes[offset + i] !== REVOCATION_MAGIC[i]) {\n throw new RevocationError(\"Revocation record magic mismatch.\", \"wrong-magic\");\n }\n }\n offset += REVOCATION_MAGIC.length;\n\n if (bytes.length < offset + 1) {\n throw new RevocationError(\"Revocation record truncated at version.\", \"truncated\");\n }\n const version = bytes[offset] as unknown as number;\n offset += 1;\n if (version !== REVOCATION_RECORD_VERSION) {\n throw new RevocationError(`Unknown revocation record version: ${version}.`, \"unknown-version\");\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at issuer length.\", \"truncated\");\n }\n const issuerLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + issuerLen) {\n throw new RevocationError(\"Revocation record truncated at issuer id.\", \"truncated\");\n }\n const issuerPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + issuerLen));\n offset += issuerLen;\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at revoked id length.\", \"truncated\");\n }\n const revokedLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + revokedLen) {\n throw new RevocationError(\"Revocation record truncated at revoked id.\", \"truncated\");\n }\n const revokedPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + revokedLen));\n offset += revokedLen;\n\n if (bytes.length < offset + 8) {\n throw new RevocationError(\"Revocation record truncated at issuedAt.\", \"truncated\");\n }\n const issuedAt = Number(view.getBigUint64(offset, false));\n offset += 8;\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at reason length.\", \"truncated\");\n }\n const reasonLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + reasonLen) {\n throw new RevocationError(\"Revocation record truncated at reason.\", \"truncated\");\n }\n const reason = new TextDecoder().decode(bytes.subarray(offset, offset + reasonLen));\n offset += reasonLen;\n\n return {\n version,\n issuerPeerId,\n revokedPeerId,\n issuedAt,\n ...(reason ? { reason } : {}),\n };\n}\n\n/**\n * Produce a signed, transportable binary blob from a revocation record.\n * Wraps the serialised payload in a {@link SignedEnvelope} signed by the\n * issuer's keypair, then encodes the envelope to bytes.\n */\nexport function encodeRevocation(record: RevocationRecord, issuer: SigningKeyPair): Uint8Array {\n const payload = serialiseRevocationPayload(record);\n const envelope = signEnvelope(payload, record.issuerPeerId, issuer.secretKey);\n return encodeSignedEnvelope(envelope);\n}\n\n/**\n * Parse and verify a signed revocation blob. Returns the decoded record\n * on success; throws {@link RevocationError} on any failure.\n *\n * Verification requires the keyring to already know the issuer's public\n * key (because Polly does not have a global PKI). If the issuer is\n * unknown, the caller receives `unknown-issuer` and can decide whether\n * to cache the revocation for later verification or drop it outright.\n *\n * Authorisation: when the keyring has a non-empty\n * {@link MeshKeyring.revocationAuthority} set, only issuers inside that\n * set can have their revocations accepted. An issuer outside the set\n * produces `unauthorised-issuer`. When the authority set is undefined\n * or empty, any signed revocation from a known peer is accepted — that\n * is the Phase 2 first-cut default, preserved for backward compatibility.\n */\nexport function decodeRevocation(bytes: Uint8Array, keyring: MeshKeyring): RevocationRecord {\n const envelope = decodeSignedEnvelope(bytes);\n const issuerKey = keyring.knownPeers.get(envelope.senderId);\n if (!issuerKey) {\n throw new RevocationError(\n `Revocation issuer ${envelope.senderId} is not in the local keyring.`,\n \"unknown-issuer\"\n );\n }\n if (\n keyring.revocationAuthority !== undefined &&\n keyring.revocationAuthority.size > 0 &&\n !keyring.revocationAuthority.has(envelope.senderId)\n ) {\n throw new RevocationError(\n `Revocation issuer ${envelope.senderId} is not in the keyring's revocation authority set.`,\n \"unauthorised-issuer\"\n );\n }\n let payloadBytes: Uint8Array;\n try {\n payloadBytes = openSignedEnvelope(envelope, issuerKey);\n } catch {\n throw new RevocationError(\n `Revocation signature failed verification for issuer ${envelope.senderId}.`,\n \"signature-invalid\"\n );\n }\n\n const record = parseRevocationPayload(payloadBytes);\n // Paranoid cross-check: the payload's claimed issuer must match the\n // envelope's authenticated sender. Mismatch means a forged payload.\n if (record.issuerPeerId !== envelope.senderId) {\n throw new RevocationError(\n `Revocation payload claims issuer ${record.issuerPeerId} but the envelope was signed by ${envelope.senderId}.`,\n \"not-signed-by-issuer\"\n );\n }\n return record;\n}\n"
|
|
26
27
|
],
|
|
27
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA;AA+BO,SAAS,mBAAmB,GAAe;AAAA,EAChD,OAAO,KAAK,YAAY,SAAS;AAAA;AAQ5B,SAAS,OAAO,CAAC,SAAqB,KAA8B;AAAA,EACzE,IAAI,IAAI,WAAW,WAAW;AAAA,IAC5B,MAAM,IAAI,gBACR,yBAAyB,wBAAwB,IAAI,WACrD,oBACF;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,KAAK,YAAY,WAAW;AAAA,EAC1C,MAAM,aAAa,KAAK,UAAU,SAAS,OAAO,GAAG;AAAA,EACrD,MAAM,MAAM,IAAI,WAAW,cAAc,WAAW,MAAM;AAAA,EAC1D,IAAI,IAAI,OAAO,CAAC;AAAA,EAChB,IAAI,IAAI,YAAY,WAAW;AAAA,EAC/B,OAAO;AAAA;AAcF,SAAS,OAAO,CAAC,QAAqB,KAAyC;AAAA,EACpF,IAAI,IAAI,WAAW,WAAW;AAAA,IAC5B,MAAM,IAAI,gBACR,yBAAyB,wBAAwB,IAAI,WACrD,oBACF;AAAA,EACF;AAAA,EACA,IAAI,OAAO,SAAS,cAAc,WAAW;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,OAAO,SAAS,GAAG,WAAW;AAAA,EAC5C,MAAM,aAAa,OAAO,SAAS,WAAW;AAAA,EAC9C,MAAM,SAAS,KAAK,UAAU,KAAK,YAAY,OAAO,GAAG;AAAA,EACzD,OAAO,UAAU;AAAA;AAOZ,SAAS,cAAc,CAAC,QAAqB,KAA6B;AAAA,EAC/E,MAAM,SAAS,QAAQ,QAAQ,GAAG;AAAA,EAClC,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,gBACR,sFACA,gBACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAoBF,SAAS,YAAY,CAC1B,SACA,YACA,KACmB;AAAA,EACnB,OAAO;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ,SAAS,GAAG;AAAA,EAC9B;AAAA;AAOK,SAAS,YAAY,CAAC,UAA6B,KAA6B;AAAA,EACrF,OAAO,eAAe,SAAS,QAAQ,GAAG;AAAA;AAYrC,SAAS,uBAAuB,CAAC,UAAyC;AAAA,EAC/E,MAAM,UAAU,IAAI,YAAY,EAAE,OAAO,SAAS,UAAU;AAAA,EAC5D,MAAM,MAAM,IAAI,WAAW,IAAI,QAAQ,SAAS,SAAS,OAAO,MAAM;AAAA,EACtE,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,QAAQ,QAAQ,KAAK;AAAA,EACvC,IAAI,IAAI,SAAS,CAAC;AAAA,EAClB,IAAI,IAAI,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAAA,EAC3C,OAAO;AAAA;AAOF,SAAS,uBAAuB,CAAC,OAAsC;AAAA,EAC5E,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,MAAM,IAAI,gBACR,iCAAiC,MAAM,iBACvC,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,QAAQ,KAAK,UAAU,GAAG,KAAK;AAAA,EACrC,IAAI,MAAM,SAAS,IAAI,OAAO;AAAA,IAC5B,MAAM,IAAI,gBACR,oDAAoD,gBAAgB,MAAM,WAC1E,oBACF;AAAA,EACF;AAAA,EACA,MAAM,aAAa,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC;AAAA,EACxE,MAAM,SAAS,MAAM,MAAM,IAAI,KAAK;AAAA,EACpC,OAAO,EAAE,YAAY,OAAO;AAAA;AAAA,IA1KjB,YAAY,IAEZ,cAAc,IAEd,YAAY,IAWZ;AAAA;AAAA,oBAAN,MAAM,wBAAwB,MAAM;AAAA,IAChC;AAAA,IACT,WAAW,CAAC,SAAiB,MAA+B;AAAA,MAC1D,MAAM,OAAO;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA;AAAA,EAEhB;AAAA;;;AC3CA;AACA;AAKA,IAAM,UAAU,IAAI,IAAI,UAAU,YAAY,GAAG,EAAE;AAEnD,MAAM,eAAe,OAAO;;;ACGrB,MAAM,gBAAqC;AAAA,EAC/B,QAAQ,IAAI;AAAA,EACZ,SAAS,IAAI;AAAA,EACb,OAAO,IAAI;AAAA,OAEtB,IAAG,CAAC,MAA+C;AAAA,IACvD,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,aAAa,KAAK,IAAI;AAAA,IAC5B,OAAO,MAAM;AAAA;AAAA,OAGT,IAAG,CAAC,MAAc,OAAkC;AAAA,IACxD,KAAK,MAAM,IAAI,MAAM,EAAE,OAAO,YAAY,KAAK,IAAI,EAAE,CAAC;AAAA;AAAA,OAGlD,IAAG,CAAC,MAAgC;AAAA,IACxC,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA;AAAA,OAGtB,OAAM,CAAC,MAA6B;AAAA,IACxC,KAAK,MAAM,OAAO,IAAI;AAAA,IACtB,KAAK,OAAO,OAAO,IAAI;AAAA,IACvB,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,IAC9B,IAAI,KAAK;AAAA,MACP,IAAI,gBAAgB,GAAG;AAAA,MACvB,KAAK,KAAK,OAAO,IAAI;AAAA,IACvB;AAAA;AAAA,OAGI,IAAG,CAAC,MAA6B;AAAA,IACrC,KAAK,OAAO,IAAI,IAAI;AAAA;AAAA,OAGhB,MAAK,CAAC,MAA6B;AAAA,IACvC,KAAK,OAAO,OAAO,IAAI;AAAA;AAAA,OAGnB,KAAI,GAAoB;AAAA,IAC5B,IAAI,QAAQ;AAAA,IACZ,WAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AAAA,MACvC,SAAS,MAAM,MAAM;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,MAAK,CAAC,UAAmC;AAAA,IAC7C,IAAI,cAAc,MAAM,KAAK,KAAK;AAAA,IAClC,IAAI,eAAe;AAAA,MAAU,OAAO;AAAA,IACpC,MAAM,QAAQ;AAAA,IAEd,MAAM,aAAwE,CAAC;AAAA,IAC/E,YAAY,MAAM,UAAU,KAAK,OAAO;AAAA,MACtC,IAAI,CAAC,KAAK,OAAO,IAAI,IAAI,GAAG;AAAA,QAC1B,WAAW,KAAK,EAAE,MAAM,YAAY,MAAM,YAAY,MAAM,MAAM,MAAM,WAAW,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,IACA,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,IAErD,WAAW,KAAK,YAAY;AAAA,MAC1B,IAAI,eAAe;AAAA,QAAU;AAAA,MAC7B,MAAM,KAAK,OAAO,EAAE,IAAI;AAAA,MACxB,eAAe,EAAE;AAAA,IACnB;AAAA,IACA,OAAO,QAAQ;AAAA;AAAA,OAKX,IAAG,CAAC,MAA2C;AAAA,IACnD,MAAM,SAAS,KAAK,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,SAAS,IAAI,YAAY,MAAM,MAAM,UAAU;AAAA,IACrD,IAAI,WAAW,MAAM,EAAE,IAAI,MAAM,KAAK;AAAA,IACtC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,IACxD,KAAK,KAAK,IAAI,MAAM,SAAS;AAAA,IAC7B,OAAO;AAAA;AAAA,EAGT,OAAO,GAAS;AAAA,IACd,WAAW,aAAa,KAAK,KAAK,OAAO,GAAG;AAAA,MAC1C,IAAI,gBAAgB,SAAS;AAAA,IAC/B;AAAA,IACA,KAAK,KAAK,MAAM;AAAA,IAChB,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,OAAO,MAAM;AAAA;AAEtB;AAAA;AAaO,MAAM,mBAAwC;AAAA,SAC3B,UAAU;AAAA,SACV,aAAa;AAAA,SACb,aAAa;AAAA,EAE7B,YAAyC;AAAA,EAChC,OAAO,IAAI;AAAA,EAEpB,MAAM,GAAyB;AAAA,IACrC,IAAI,KAAK;AAAA,MAAW,OAAO,KAAK;AAAA,IAChC,KAAK,YAAY,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MAChD,MAAM,UAAU,UAAU,KAAK,mBAAmB,SAAS,mBAAmB,UAAU;AAAA,MACxF,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,MAC5C,QAAQ,YAAY,MAAM,QAAQ,QAAQ,MAAM;AAAA,MAChD,QAAQ,kBAAkB,CAAC,UAAU;AAAA,QACnC,MAAM,KAAM,MAAM,OAAuC;AAAA,QACzD,IAAI,CAAC,GAAG,iBAAiB,SAAS,mBAAmB,UAAU,GAAG;AAAA,UAChE,GAAG,kBAAkB,mBAAmB,UAAU;AAAA,QACpD;AAAA;AAAA,KAEH;AAAA,IACD,OAAO,KAAK;AAAA;AAAA,OAGA,UAAS,CAAC,MAA8C;AAAA,IACpE,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,UAAU;AAAA,MACnE,MAAM,QAAQ,GAAG,YAAY,mBAAmB,UAAU;AAAA,MAC1D,MAAM,UAAU,MAAM,IAAI,IAAI;AAAA,MAC9B,QAAQ,YAAY,MAAM,QAAQ,QAAQ,MAA0C;AAAA,MACpF,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,KAC7C;AAAA;AAAA,OAGW,UAAS,CAAC,MAAc,QAAkC;AAAA,IACtE,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,WAAW;AAAA,MACpE,MAAM,QAAQ,GAAG,YAAY,mBAAmB,UAAU;AAAA,MAC1D,MAAM,IAAI,QAAQ,IAAI;AAAA,MACtB,GAAG,aAAa,MAAM,QAAQ;AAAA,MAC9B,GAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,KACnC;AAAA;AAAA,OAGG,IAAG,CAAC,MAA+C;AAAA,IACvD,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IAGR,KAAK,UAAU,MAAM,KAAK,QAAQ,YAAY,KAAK,IAAI,EAAE,CAAC;AAAA,IAC/D,OAAO,OAAO;AAAA;AAAA,OAGV,IAAG,CAAC,MAAc,OAAkC;AAAA,IACxD,MAAM,WAAW,MAAM,KAAK,UAAU,IAAI;AAAA,IAC1C,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,YAAY,KAAK,IAAI;AAAA,MACrB,QAAQ,UAAU,UAAU;AAAA,IAC9B,CAAC;AAAA;AAAA,OAGG,IAAG,CAAC,MAAgC;AAAA,IACxC,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,UAAU;AAAA,MACnE,MAAM,QAAQ,GAAG,YAAY,mBAAmB,UAAU;AAAA,MAC1D,MAAM,UAAU,MAAM,MAAM,IAAI;AAAA,MAChC,QAAQ,YAAY,MAAM,QAAQ,QAAQ,SAAS,CAAC;AAAA,MACpD,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,KAC7C;AAAA;AAAA,OAGG,OAAM,CAAC,MAA6B;AAAA,IACxC,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,IAC9B,IAAI,KAAK;AAAA,MACP,IAAI,gBAAgB,GAAG;AAAA,MACvB,KAAK,KAAK,OAAO,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,WAAW;AAAA,MACpE,MAAM,QAAQ,GAAG,YAAY,mBAAmB,UAAU;AAAA,MAC1D,MAAM,OAAO,IAAI;AAAA,MACjB,GAAG,aAAa,MAAM,QAAQ;AAAA,MAC9B,GAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,KACnC;AAAA;AAAA,OAGG,IAAG,CAAC,MAA6B;AAAA,IACrC,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,KAAK,UAAU,MAAM,KAAK,QAAQ,QAAQ,KAAK,CAAC;AAAA;AAAA,OAGlD,MAAK,CAAC,MAA6B;AAAA,IACvC,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,KAAK,UAAU,MAAM,KAAK,QAAQ,QAAQ,MAAM,CAAC;AAAA;AAAA,OAGnD,KAAI,GAAoB;AAAA,IAC5B,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,UAAU;AAAA,MACnE,MAAM,QAAQ,GAAG,YAAY,mBAAmB,UAAU;AAAA,MAC1D,MAAM,UAAU,MAAM,WAAW;AAAA,MACjC,IAAI,QAAQ;AAAA,MACZ,QAAQ,YAAY,MAAM;AAAA,QACxB,MAAM,SAAS,QAAQ;AAAA,QACvB,IAAI,QAAQ;AAAA,UACV,MAAM,QAAQ,OAAO;AAAA,UACrB,SAAS,MAAM;AAAA,UACf,OAAO,SAAS;AAAA,QAClB,EAAO;AAAA,UACL,QAAQ,KAAK;AAAA;AAAA;AAAA,MAGjB,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,KAC7C;AAAA;AAAA,OAGG,MAAK,CAAC,UAAmC;AAAA,IAC7C,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,aAAwE,CAAC;AAAA,IAC/E,IAAI,YAAY;AAAA,IAEhB,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,MAC3C,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,UAAU;AAAA,MACnE,MAAM,QAAQ,GAAG,YAAY,mBAAmB,UAAU;AAAA,MAC1D,MAAM,UAAU,MAAM,WAAW;AAAA,MACjC,QAAQ,YAAY,MAAM;AAAA,QACxB,MAAM,SAAS,QAAQ;AAAA,QACvB,IAAI,QAAQ;AAAA,UACV,MAAM,QAAQ,OAAO;AAAA,UACrB,aAAa,MAAM;AAAA,UACnB,IAAI,CAAC,MAAM,QAAQ;AAAA,YACjB,WAAW,KAAK;AAAA,cACd,MAAM,OAAO;AAAA,cACb,YAAY,MAAM;AAAA,cAClB,MAAM,MAAM;AAAA,YACd,CAAC;AAAA,UACH;AAAA,UACA,OAAO,SAAS;AAAA,QAClB,EAAO;AAAA,UACL,QAAQ;AAAA;AAAA;AAAA,MAGZ,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,KAC7C;AAAA,IAED,IAAI,aAAa;AAAA,MAAU,OAAO;AAAA,IAClC,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,IAErD,IAAI,QAAQ;AAAA,IACZ,WAAW,KAAK,YAAY;AAAA,MAC1B,IAAI,aAAa;AAAA,QAAU;AAAA,MAC3B,MAAM,KAAK,OAAO,EAAE,IAAI;AAAA,MACxB,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,IACb;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,IAAG,CAAC,MAA2C;AAAA,IACnD,MAAM,SAAS,KAAK,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,MAAM,QAAQ,MAAM,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,IAC/C,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK;AAAA,IAChC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,IACxD,KAAK,KAAK,IAAI,MAAM,SAAS;AAAA,IAC7B,OAAO;AAAA;AAAA,EAGT,OAAO,GAAS;AAAA,IACd,WAAW,aAAa,KAAK,KAAK,OAAO,GAAG;AAAA,MAC1C,IAAI,gBAAgB,SAAS;AAAA,IAC/B;AAAA,IACA,KAAK,KAAK,MAAM;AAAA;AAEpB;;ACpQO,SAAS,SAAS,CAAC,OAAkC;AAAA,EAC1D,IAAI,OAAO,UAAU,YAAY,UAAU;AAAA,IAAM,OAAO;AAAA,EACxD,MAAM,IAAI;AAAA,EACV,OACE,OAAO,EAAE,YAAY,YACrB,iBAAiB,KAAK,EAAE,OAAO,KAC/B,OAAO,EAAE,YAAY,YACrB,OAAO,UAAU,EAAE,OAAO,KAC1B,EAAE,WAAW,KACb,OAAO,EAAE,gBAAgB,YACzB,OAAO,EAAE,gBAAgB;AAAA;AAO7B,eAAsB,eAAe,CAAC,OAAoC;AAAA,EAIxE,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,EAC/C,MAAM,OAAO,IAAI,WAAW,MAAM;AAAA,EAClC,KAAK,IAAI,KAAK;AAAA,EACd,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,MAAM;AAAA,EAC3D,MAAM,OAAO,IAAI,WAAW,MAAM;AAAA,EAClC,IAAI,MAAM;AAAA,EACV,WAAW,QAAQ,MAAM;AAAA,IACvB,OAAO,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAC1C;AAAA,EACA,OAAO;AAAA;AAiBT,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,GACsC;AAAA,EACtC,MAAM,OAAO,MAAM,gBAAgB,KAAK;AAAA,EACxC,OAAO;AAAA,IACL;AAAA,IACA,MAAM,MAAM;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAAA;;AC7FK,IAAM,kBAAkB;AAIxB,IAAM,yBAAyB,MAAM;AA4BrC,SAAS,SAAS,CAAC,OAAmB,YAAoB,iBAA+B;AAAA,EAC9F,MAAM,SAAuB,CAAC;AAAA,EAC9B,SAAS,SAAS,EAAG,SAAS,MAAM,QAAQ,UAAU,WAAW;AAAA,IAC/D,OAAO,KAAK,MAAM,SAAS,QAAQ,KAAK,IAAI,SAAS,WAAW,MAAM,MAAM,CAAC,CAAC;AAAA,EAChF;AAAA,EAGA,IAAI,OAAO,WAAW,GAAG;AAAA,IACvB,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA;AAKF,SAAS,gBAAgB,CAAC,QAAiC,OAA2B;AAAA,EAC3F,IAAI,aAAa;AAAA,EACjB,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MAAM,mCAAmC,QAAQ,OAAO;AAAA,IACpE;AAAA,IACA,cAAc,MAAM;AAAA,EACtB;AAAA,EACA,MAAM,MAAM,IAAI,WAAW,UAAU;AAAA,EACrC,IAAI,SAAS;AAAA,EACb,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,IAAI,OAAO,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,EAClB;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,mBAAmB,CAAC,QAAiC,OAAyB;AAAA,EAC5F,MAAM,UAAoB,CAAC;AAAA,EAC3B,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG;AAAA,MAClB,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAQF,SAAS,oBAAoB,CAClC,QACA,OAAmB,IAAI,WAAW,CAAC,GACV;AAAA,EACzB,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,MAAM,CAAC;AAAA,EACnE,MAAM,OAAO,IAAI,YAAY,SAAS,KAAK;AAAA,EAC3C,MAAM,SAAS,IAAI,YAAY,IAAI;AAAA,EACnC,MAAM,MAAM,IAAI,WAAW,MAAM;AAAA,EACjC,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,EAChC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,MAAM,IAAI,YAAY,MAAM;AAAA,EACpC,OAAO;AAAA;AAyBF,SAAS,iBAAiB,CAAC,OAA4B;AAAA,EAC5D,IAAI,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EAC7B,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI;AAAA,IAAW,OAAO;AAAA,EAGzC,MAAM,cAAc,MAAM,SAAS,GAAG,IAAI,SAAS;AAAA,EAEnD,MAAM,SAAS,IAAI,YAAY,EAAE,OAAO,eAAe;AAAA,EACvD,OAAO,aAAa,aAAa,MAAM,MAAM;AAAA;AAI/C,SAAS,YAAY,CAAC,UAAsB,QAA4B;AAAA,EACtE,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAChC;AAAA,IAAO,SAAS,IAAI,EAAG,KAAK,SAAS,SAAS,OAAO,QAAQ,KAAK;AAAA,MAChE,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,QACtC,IAAI,SAAS,IAAI,OAAO,OAAO;AAAA,UAAI;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACA,OAAO;AAAA;;;ACrHT,IAAM,wBAAwB,MAAM,OAAO;AAC3C,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAsBrB,SAAS,eAAe,CAAC,SAA4B,SAAuC;AAAA,EACjG,MAAM,cAAc,SAAS,eAAe;AAAA,EAC5C,MAAM,aAAa,SAAS,SAAS;AAAA,EACrC,MAAM,QAAmB,SAAS,SAAS,IAAI;AAAA,EAI/C,MAAM,aAAa,IAAI;AAAA,EAEvB,MAAM,YAAY,IAAI;AAAA,EAEtB,MAAM,YAAY,IAAI;AAAA,EAEtB,MAAM,cAAc,IAAI;AAAA,EAExB,MAAM,WAAW,IAAI;AAAA,EACrB,IAAI,WAAW;AAAA,EAGf,QAAQ,gBAAgB,CAAC,QAAQ,QAAQ,SAAS;AAAA,IAChD,IAAI;AAAA,MAAU;AAAA,IACd,MAAM,OAAO,OAAO;AAAA,IACpB,QAAQ;AAAA,WACD;AAAA,QACE,YAAY,QAAQ,QAAsC,IAAI;AAAA,QACnE;AAAA,WACG;AAAA,QACE,cAAc,QAAQ,MAAsC;AAAA,QACjE;AAAA,WACG;AAAA,QACH,WAAW,QAAQ,MAAmC;AAAA,QACtD;AAAA;AAAA;AAAA,EAKN,MAAM,uBAAuB,CAAC,UAA+B;AAAA,IAC3D,IAAI;AAAA,MAAU;AAAA,IACd,MAAM,YAAY,MAAM;AAAA,IACxB,WAAW,QAAQ,aAAa;AAAA,MAC9B,MAAM,MAAM,qBAAqB,EAAE,MAAM,aAAa,KAAK,CAAiC;AAAA,MAC5F,QAAQ,gBAAgB,WAAW,GAAG;AAAA,IACxC;AAAA;AAAA,EAEF,QAAQ,GAAG,kBAAkB,oBAAoB;AAAA,EAIjD,eAAe,YAAY,CAAC,WAAuB,KAAsC;AAAA,IACvF,QAAQ,sBAAY;AAAA,IACpB,OAAO,SAAQ,WAAW,GAAG;AAAA;AAAA,EAG/B,eAAe,YAAY,CACzB,QACA,KACiC;AAAA,IACjC,QAAQ,sBAAY;AAAA,IACpB,OAAO,SAAQ,QAAQ,GAAG;AAAA;AAAA,EAK5B,eAAe,WAAW,CACxB,QACA,QACA,MACe;AAAA,IACf,MAAM,WAAW,UAAU,IAAI,OAAO,IAAI;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,SAAS,QAAQ,OAAO;AAAA,IAGxB,IAAI,CAAC,SAAS,eAAe,SAAS,MAAM,GAAG;AAAA,MAC7C,SAAS,eAAe,KAAK,MAAM;AAAA,IACrC;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI,SAAS,KAAK;AAAA,MAChB,MAAM,YAAY,MAAM,aAAa,MAAM,SAAS,GAAG;AAAA,MACvD,IAAI,CAAC,WAAW;AAAA,QAEd;AAAA,MACF;AAAA,MACA,aAAa;AAAA,IACf,EAAO;AAAA,MACL,aAAa,KAAK,MAAM;AAAA;AAAA,IAG1B,SAAS,OAAO,IAAI,OAAO,OAAO,UAAU;AAAA,IAE5C,oBAAoB,QAAQ;AAAA,IAC5B,oBAAoB,QAAQ;AAAA,IAE5B,IAAI,SAAS,OAAO,QAAQ,OAAO,OAAO;AAAA,MACxC,eAAe,OAAO,MAAM,QAAQ;AAAA,IACtC,EAAO;AAAA,MACL,kBAAkB,OAAO,MAAM,QAAQ;AAAA;AAAA;AAAA,EAI3C,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,CAAC,SAAS,cAAc,SAAS,SAAS;AAAA,MAAG;AAAA,IACjD,IAAI,SAAS;AAAA,IACb,WAAW,SAAS,SAAS,OAAO,OAAO,GAAG;AAAA,MAC5C,UAAU,MAAM;AAAA,IAClB;AAAA,IACA,SAAS,WAAW,EAAE,QAAQ,OAAO,WAAW,OAAO,cAAc,CAAC;AAAA;AAAA,EAGxE,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,SAAS,aAAa;AAAA,MACxB,aAAa,SAAS,WAAW;AAAA,MACjC,SAAS,cAAc;AAAA,IACzB;AAAA;AAAA,EAGF,SAAS,cAAc,CAAC,MAAc,UAA+B;AAAA,IACnE,oBAAoB,QAAQ;AAAA,IAC5B,IAAI;AAAA,MACF,MAAM,YAAY,iBAAiB,SAAS,QAAQ,SAAS,KAAK;AAAA,MAClE,UAAU,OAAO,IAAI;AAAA,MACrB,SAAS,QAAQ,SAAS;AAAA,MAC1B,OAAO,KAAK;AAAA,MACZ,UAAU,OAAO,IAAI;AAAA,MACrB,SAAS,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA;AAAA;AAAA,EAIvE,eAAe,aAAa,CAAC,QAAgB,QAA0C;AAAA,IACrF,MAAM,YAAY,MAAM,MAAM,IAAI,OAAO,IAAI;AAAA,IAC7C,IAAI,CAAC;AAAA,MAAW;AAAA,IAEhB,MAAM,kBAAkB,UAAU,SAAS;AAAA,IAC3C,MAAM,YAAY,OAAO,WAAW,gBAAgB,IAAI,CAAC,GAAG,MAAM,CAAC;AAAA,IACnE,MAAM,WAAW,WAAW,IAAI,OAAO,IAAI;AAAA,IAE3C,WAAW,SAAS,WAAW;AAAA,MAC7B,MAAM,iBAAiB,QAAQ,OAAO,MAAM,iBAAiB,OAAO,QAAQ;AAAA,IAC9E;AAAA;AAAA,EAGF,eAAe,gBAAgB,CAC7B,QACA,MACA,iBACA,OACA,UACe;AAAA,IACf,IAAI,QAAQ,KAAK,SAAS,gBAAgB;AAAA,MAAQ;AAAA,IAClD,MAAM,aAAa,gBAAgB;AAAA,IACnC,IAAI,CAAC;AAAA,MAAY;AAAA,IAEjB,MAAM,UAAU,WAAW,MAAM,aAAa,YAAY,QAAQ,IAAI;AAAA,IACtE,MAAM,cAA+B;AAAA,MACnC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO,gBAAgB;AAAA,IACzB;AAAA,IACA,MAAM,MAAM,qBAAqB,aAA6C,OAAO;AAAA,IAErF,IAAI,CAAC,QAAQ,gBAAgB,QAAQ,GAAG,GAAG;AAAA,MACzC,MAAM,mBAAmB;AAAA,MACzB,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IACrC;AAAA;AAAA,EAGF,SAAS,UAAU,CAAC,QAAgB,QAA8B;AAAA,IAChE,IAAI,QAAQ,UAAU,IAAI,OAAO,IAAI;AAAA,IACrC,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI,OAAO,MAAM,KAAK;AAAA,IAClC;AAAA,IACA,MAAM,IAAI,MAAM;AAAA;AAAA,EAKlB,SAAS,YAAY,CAAC,MAAoB;AAAA,IACxC,MAAM,MAAM,qBAAqB,EAAE,MAAM,aAAa,KAAK,CAAiC;AAAA,IAC5F,WAAW,UAAU,QAAQ,kBAAkB;AAAA,MAC7C,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IACrC;AAAA;AAAA,EAGF,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,SAAS;AAAA,MAAW,aAAa,SAAS,SAAS;AAAA,IACvD,IAAI,SAAS;AAAA,MAAa,aAAa,SAAS,WAAW;AAAA;AAAA,EAG7D,SAAS,iBAAiB,CAAC,MAAc,UAA+B;AAAA,IACtE,SAAS,cAAc,WAAW,MAAM,cAAc,MAAM,QAAQ,GAAG,mBAAmB;AAAA;AAAA,EAG5F,SAAS,aAAa,CAAC,MAAc,UAA+B;AAAA,IAClE,IAAI,CAAC,UAAU,IAAI,IAAI;AAAA,MAAG;AAAA,IAC1B,MAAM,UAAU,oBAAoB,SAAS,QAAQ,SAAS,KAAK;AAAA,IACnE,IAAI,QAAQ,WAAW;AAAA,MAAG;AAAA,IAI1B,MAAM,QAAQ,UAAU,IAAI,IAAI;AAAA,IAChC,MAAM,OAAO,SAAS,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,gBAAgB;AAAA,IAC9F,IAAI,KAAK,WAAW;AAAA,MAAG;AAAA,IACvB,MAAM,SAAS,KAAK,SAAS,oBAAoB,KAAK;AAAA,IACtD,SAAS;AAAA,IACT,IAAI,CAAC;AAAA,MAAQ;AAAA,IAEb,MAAM,YAA+B,EAAE,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IAC3E,MAAM,MAAM,qBAAqB,SAAyC;AAAA,IAC1E,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IAGnC,kBAAkB,MAAM,QAAQ;AAAA;AAAA,EAGlC,SAAS,kBAAkB,GAAkB;AAAA,IAC3C,OAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA;AAAA,EAKzD,MAAM,QAAmB;AAAA,SACjB,IAAG,CAAC,KAAK,OAAO,UAAyB;AAAA,MAC7C,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,uBAAuB;AAAA,MACrD,UAAS,QAAQ,eAAe;AAAA,MAEhC,IAAI,MAAM,SAAS,aAAa;AAAA,QAC9B,MAAM,IAAI,MAAM,8BAA8B,MAAM,YAAY,cAAc;AAAA,MAChF;AAAA,MAGA,MAAM,OAAO,MAAM,gBAAgB,KAAK;AAAA,MACxC,IAAI,SAAS,IAAI,MAAM;AAAA,QACrB,MAAM,IAAI,MAAM,2BAA2B,IAAI,aAAa,MAAM;AAAA,MACpE;AAAA,MAEA,UAAS,QAAQ,eAAe;AAAA,MAKhC,MAAM,MAAM,UAAS,OAAO;AAAA,MAC5B,IAAI,KAAK;AAAA,QACP,WAAW,IAAI,IAAI,MAAM,GAAG;AAAA,MAC9B;AAAA,MAEA,UAAS,aAAa,EAAE,QAAQ,MAAM,QAAQ,OAAO,MAAM,QAAQ,OAAO,YAAY,CAAC;AAAA,MAIvF,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK;AAAA,MAC/B,YAAY,IAAI,IAAI,IAAI;AAAA,MAExB,aAAa,IAAI,IAAI;AAAA;AAAA,SAGjB,IAAG,CAAC,MAAM,UAA2C;AAAA,MACzD,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,uBAAuB;AAAA,MACrD,UAAS,QAAQ,eAAe;AAAA,MAGhC,MAAM,SAAS,MAAM,MAAM,IAAI,IAAI;AAAA,MACnC,IAAI;AAAA,QAAQ,OAAO;AAAA,MAInB,MAAM,MAAM,UAAS,OAAO;AAAA,MAG5B,MAAM,QAAQ,UAAU,IAAI,IAAI;AAAA,MAChC,MAAM,aACJ,SAAS,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,gBAAgB;AAAA,MACnF,MAAM,aAAa,WAAW;AAAA,MAC9B,IAAI,CAAC;AAAA,QAAY;AAAA,MAEjB,MAAM,gBAAmC,EAAE,MAAM,gBAAgB,KAAK;AAAA,MACtE,MAAM,MAAM,qBAAqB,aAA6C;AAAA,MAC9E,QAAQ,gBAAgB,YAAY,GAAG;AAAA,MAGvC,MAAM,YAAY,MAAM,IAAI,QAAoB,CAAC,SAAS,WAAW;AAAA,QACnE,MAAM,WAA0B;AAAA,UAC9B,OAAO;AAAA,UACP,QAAQ,IAAI;AAAA,UACZ;AAAA,UACA;AAAA,UACA,YAAY,UAAS;AAAA,UACrB;AAAA,UACA,gBAAgB,CAAC,UAAU;AAAA,UAC3B,mBAAmB;AAAA,QACrB;AAAA,QACA,UAAU,IAAI,MAAM,QAAQ;AAAA,QAE5B,UAAS,QAAQ,iBACf,SACA,MAAM;AAAA,UACJ,IAAI,UAAU,IAAI,IAAI,GAAG;AAAA,YACvB,oBAAoB,QAAQ;AAAA,YAC5B,UAAU,OAAO,IAAI;AAAA,YACrB,OAAO,IAAI,MAAM,uBAAuB,CAAC;AAAA,UAC3C;AAAA,WAEF,EAAE,MAAM,KAAK,CACf;AAAA,QAEA,SAAS,YAAY,WAAW,MAAM;AAAA,UACpC,IAAI,UAAU,IAAI,IAAI,GAAG;AAAA,YACvB,oBAAoB,QAAQ;AAAA,YAC5B,UAAU,OAAO,IAAI;AAAA,YACrB,OAAO,IAAI,MAAM,yBAAyB,CAAC;AAAA,UAC7C;AAAA,WACC,mBAAmB;AAAA,OACvB;AAAA,MAGD,MAAM,aAAa,MAAM,gBAAgB,SAAS;AAAA,MAClD,IAAI,eAAe,MAAM;AAAA,QACvB,MAAM,IAAI,MAAM,+CAA+C,aAAa,YAAY;AAAA,MAC1F;AAAA,MAIA,MAAM,MAAM,IAAI,MAAM,SAAS;AAAA,MAC/B,IAAI;AAAA,QAAK,WAAW,IAAI,MAAM,GAAG;AAAA,MACjC,YAAY,IAAI,IAAI;AAAA,MAEpB,OAAO;AAAA;AAAA,SAGH,IAAG,CAAC,MAAmC;AAAA,MAC3C,IAAI;AAAA,QAAU;AAAA,MACd,MAAM,SAAS,SAAS,IAAI,IAAI;AAAA,MAChC,IAAI;AAAA,QAAQ,OAAO;AAAA,MACnB,MAAM,QAAQ,MAAM,MAAM,IAAI,IAAI;AAAA,MAClC,IAAI,CAAC;AAAA,QAAO;AAAA,MACZ,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,MAC/C,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK;AAAA,MAChC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,MACxD,SAAS,IAAI,MAAM,SAAS;AAAA,MAC5B,OAAO;AAAA;AAAA,SAGH,IAAG,CAAC,MAAqB;AAAA,MAC7B,MAAM,MAAM,IAAI,IAAI;AAAA;AAAA,SAGhB,MAAK,CAAC,MAAqB;AAAA,MAC/B,MAAM,MAAM,MAAM,IAAI;AAAA;AAAA,SAGlB,KAAI,GAAoB;AAAA,MAC5B,OAAO,MAAM,KAAK;AAAA;AAAA,SAGd,MAAK,CAAC,UAA2B;AAAA,MACrC,OAAO,MAAM,MAAM,QAAQ;AAAA;AAAA,IAG7B,OAAO,GAAS;AAAA,MACd,WAAW;AAAA,MACX,QAAQ,gBAAgB;AAAA,MACxB,QAAQ,IAAI,kBAAkB,oBAAoB;AAAA,MAClD,YAAY,MAAM,aAAa,WAAW;AAAA,QACxC,oBAAoB,QAAQ;AAAA,QAC5B,SAAS,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,QAC/C,UAAU,OAAO,IAAI;AAAA,MACvB;AAAA,MACA,WAAW,aAAa,SAAS,OAAO,GAAG;AAAA,QACzC,IAAI,gBAAgB,SAAS;AAAA,MAC/B;AAAA,MACA,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,EAElB;AAAA,EAEA,OAAO;AAAA;;;AC5ZT;;;ACUO,SAAS,oBAAoB,GAAmB;AAAA,EACrD,IAAI,SAA6B;AAAA,EACjC,OAAO;AAAA,IACL,MAAM,YAAY;AAAA,IAClB,MAAM,OAAO,YAAY;AAAA,MACvB,SAAS;AAAA;AAAA,EAEb;AAAA;AAqBK,SAAS,gBAAgB,CAAC,SAA8B;AAAA,EAC7D,MAAM,UAA6B;AAAA,IACjC,SAAS;AAAA,IACT,UAAU;AAAA,MACR,WAAW,cAAc,QAAQ,SAAS,SAAS;AAAA,MACnD,WAAW,cAAc,QAAQ,SAAS,SAAS;AAAA,IACrD;AAAA,IACA,YAAY,kBAAkB,QAAQ,UAAU;AAAA,IAChD,cAAc,kBAAkB,QAAQ,YAAY;AAAA,IACpD,cAAc,CAAC,GAAG,QAAQ,YAAY;AAAA,EACxC;AAAA,EACA,IAAI,QAAQ,uBAAuB,QAAQ,oBAAoB,OAAO,GAAG;AAAA,IACvE,QAAQ,sBAAsB,CAAC,GAAG,QAAQ,mBAAmB;AAAA,EAC/D;AAAA,EACA,OAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA;AASjC,SAAS,kBAAkB,CAAC,MAA2B;AAAA,EAC5D,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,KAAK,MAAM,IAAI;AAAA,IACrB,OAAO,KAAK;AAAA,IACZ,MAAM,IAAI,MAAM,sDAAuD,IAAc,SAAS;AAAA;AAAA,EAEhG,IAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AAAA,IACnC,MAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EACA,MAAM,IAAI;AAAA,EACV,IAAI,EAAE,YAAY,GAAG;AAAA,IACnB,MAAM,IAAI,MAAM,gDAAgD,OAAO,EAAE,OAAO,GAAG;AAAA,EACrF;AAAA,EACA,IAAI,CAAC,EAAE,YAAY,OAAO,EAAE,aAAa,UAAU;AAAA,IACjD,MAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAAA,EACA,MAAM,WAA2B;AAAA,IAC/B,WAAW,cAAc,EAAE,SAAS,SAAS;AAAA,IAC7C,WAAW,cAAc,EAAE,SAAS,SAAS;AAAA,EAC/C;AAAA,EACA,MAAM,UAAuB;AAAA,IAC3B;AAAA,IACA,YAAY,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAAA,IAChD,cAAc,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;AAAA,IACpD,cAAc,IAAI,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAAA,EAC5C;AAAA,EACA,IAAI,EAAE,uBAAuB,EAAE,oBAAoB,SAAS,GAAG;AAAA,IAC7D,QAAQ,sBAAsB,IAAI,IAAI,EAAE,mBAAmB;AAAA,EAC7D;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,KAAsD;AAAA,EAC/E,MAAM,MAA8B,CAAC;AAAA,EACrC,YAAY,KAAK,UAAU,KAAK;AAAA,IAC9B,IAAI,OAAO,cAAc,KAAK;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,QAAyD;AAAA,EAClF,MAAM,MAAM,IAAI;AAAA,EAChB,YAAY,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,IACjD,IAAI,IAAI,KAAK,cAAc,KAAK,CAAC;AAAA,EACnC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,OAA2B;AAAA,EAEhD,IAAI,SAAS;AAAA,EACb,WAAW,QAAQ,OAAO;AAAA,IACxB,UAAU,OAAO,aAAa,IAAI;AAAA,EACpC;AAAA,EACA,OAAO,KAAK,MAAM;AAAA;AAGpB,SAAS,aAAa,CAAC,KAAyB;AAAA,EAC9C,MAAM,SAAS,KAAK,GAAG;AAAA,EACvB,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAAA,EAC1C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,IACtC,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;;AC1IT;;;AC0BA;AANA;AAAA;AAAA;;;ACTA;AAGO,IAAM,mBAAmB;AAEzB,IAAM,mBAAmB;AAEzB,IAAM,kBAAkB;AAAA;AA4BxB,MAAM,qBAAqB,MAAM;AAAA,EAC7B;AAAA,EAMT,WAAW,CAAC,SAAiB,MAA4B;AAAA,IACvD,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAKO,SAAS,sBAAsB,GAAmB;AAAA,EACvD,MAAM,OAAO,MAAK,KAAK,QAAQ;AAAA,EAC/B,OAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,EAClB;AAAA;AAOK,SAAS,wBAAwB,CAAC,WAAuC;AAAA,EAC9E,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,MAAK,KAAK,QAAQ,cAAc,SAAS;AAAA,EACtD,OAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,EAClB;AAAA;AAOK,SAAS,IAAI,CAAC,SAAqB,WAAmC;AAAA,EAC3E,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,OAAO,MAAK,KAAK,SAAS,SAAS,SAAS;AAAA;AASvC,SAAS,MAAM,CAAC,SAAqB,WAAuB,WAAgC;AAAA,EACjG,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,IAAI,UAAU,WAAW,iBAAiB;AAAA,IACxC,MAAM,IAAI,aACR,6BAA6B,8BAA8B,UAAU,WACrE,0BACF;AAAA,EACF;AAAA,EACA,OAAO,MAAK,KAAK,SAAS,OAAO,SAAS,WAAW,SAAS;AAAA;AAQzD,SAAS,YAAY,CAC1B,SACA,UACA,WACgB;AAAA,EAChB,MAAM,YAAY,KAAK,SAAS,SAAS;AAAA,EACzC,OAAO,EAAE,UAAU,SAAS,UAAU;AAAA;AASjC,SAAS,aAAY,CAAC,UAA0B,WAAmC;AAAA,EACxF,MAAM,KAAK,OAAO,SAAS,SAAS,SAAS,WAAW,SAAS;AAAA,EACjE,IAAI,CAAC,IAAI;AAAA,IACP,MAAM,IAAI,aACR,mDAAmD,SAAS,aAC5D,oBACF;AAAA,EACF;AAAA,EACA,OAAO,SAAS;AAAA;AAeX,SAAS,oBAAoB,CAAC,UAAsC;AAAA,EACzE,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,SAAS,QAAQ;AAAA,EAC9D,MAAM,QAAQ,IAAI,YAAY,SAAS,kBAAkB,SAAS,QAAQ;AAAA,EAC1E,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,SAAS,WAAW,IAAI,YAAY,MAAM;AAAA,EAClD,IAAI,IAAI,SAAS,SAAS,IAAI,YAAY,SAAS,eAAe;AAAA,EAClE,OAAO;AAAA;AAOF,SAAS,oBAAoB,CAAC,OAAmC;AAAA,EACtE,IAAI,MAAM,SAAS,IAAI,iBAAiB;AAAA,IACtC,MAAM,IAAI,aACR,uBAAuB,MAAM,+BAA+B,IAAI,oBAChE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI,YAAY,iBAAiB;AAAA,IAClD,MAAM,IAAI,aACR,8CAA8C,oBAAoB,MAAM,WACxE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,WAAW,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;AAAA,EAC1E,MAAM,YAAY,MAAM,MAAM,IAAI,WAAW,IAAI,YAAY,eAAe;AAAA,EAC5E,MAAM,UAAU,MAAM,MAAM,IAAI,YAAY,eAAe;AAAA,EAC3D,OAAO,EAAE,UAAU,SAAS,UAAU;AAAA;;;AD/JjC,IAAM,sBAAsB;AAAA;AA4E5B,MAAM,2BAA2B,eAAe;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,MAOL,OAAO,GAAgB;AAAA,IACzB,OAAO,KAAK,cAAc;AAAA;AAAA,EAG5B,WAAW,CAAC,SAAoC;AAAA,IAC9C,MAAM;AAAA,IACN,KAAK,OAAO,QAAQ;AAAA,IACpB,KAAK,gBAAgB,QAAQ;AAAA,IAC7B,KAAK,oBAAoB,QAAQ,qBAAqB;AAAA,IAGtD,KAAK,KAAK,GAAG,SAAS,MAAM,KAAK,KAAK,OAAO,CAAC;AAAA,IAC9C,KAAK,KAAK,GAAG,kBAAkB,CAAC,YAAY,KAAK,KAAK,kBAAkB,OAAO,CAAC;AAAA,IAChF,KAAK,KAAK,GAAG,qBAAqB,CAAC,YAAY,KAAK,KAAK,qBAAqB,OAAO,CAAC;AAAA,IAItF,KAAK,KAAK,GAAG,WAAW,CAAC,eAAe;AAAA,MACtC,MAAM,YAAY,KAAK,UAAU,UAAU;AAAA,MAC3C,IAAI,WAAW;AAAA,QACb,KAAK,KAAK,WAAW,SAAS;AAAA,MAChC;AAAA,KAMD;AAAA;AAAA,EAGH,OAAO,GAAY;AAAA,IACjB,OAAO,KAAK,KAAK,QAAQ;AAAA;AAAA,EAG3B,SAAS,GAAkB;AAAA,IACzB,OAAO,KAAK,KAAK,UAAU;AAAA;AAAA,EAG7B,OAAO,CAAC,QAAgB,cAAmC;AAAA,IACzD,KAAK,SAAS;AAAA,IACd,IAAI,iBAAiB,WAAW;AAAA,MAC9B,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,KAAK,KAAK,QAAQ,QAAQ,YAAY;AAAA;AAAA,EAGxC,UAAU,GAAS;AAAA,IACjB,KAAK,KAAK,WAAW;AAAA;AAAA,EAGvB,IAAI,CAAC,SAAwB;AAAA,IAC3B,MAAM,UAAU,KAAK,KAAK,OAAO;AAAA,IACjC,KAAK,KAAK,KAAK,OAAO;AAAA;AAAA,EAQhB,IAAI,CAAC,SAA2B;AAAA,IACtC,MAAM,UAAU,KAAK,cAAc;AAAA,IACnC,MAAM,aAAa,iBAAiB,OAAO;AAAA,IAE3C,IAAI;AAAA,IACJ,IAAI,KAAK,mBAAmB;AAAA,MAC1B,MAAM,SAAS,QAAQ,aAAa,IAAI,mBAAmB;AAAA,MAC3D,IAAI,CAAC,QAAQ;AAAA,QACX,MAAM,IAAI,MACR,iEAAiE,wEACnE;AAAA,MACF;AAAA,MACA,MAAM,YAAY,aAAsB,YAAY,qBAAqB,MAAM;AAAA,MAC/E,gBAAgB,wBAAwB,SAAS;AAAA,IACnD,EAAO;AAAA,MACL,gBAAgB;AAAA;AAAA,IAGlB,MAAM,SAAS,aAAa,eAAe,QAAQ,UAAU,QAAQ,SAAS,SAAS;AAAA,IACvF,MAAM,cAAc,qBAAqB,MAAM;AAAA,IAE/C,OAAO;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,MAAM;AAAA,IACR;AAAA;AAAA,EAOM,SAAS,CAAC,SAAuC;AAAA,IACvD,IAAI,CAAC,QAAQ;AAAA,MAAM;AAAA,IAEnB,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,qBAAqB,QAAQ,IAAI;AAAA,MAC1C,MAAM;AAAA,MACN;AAAA;AAAA,IAQF,MAAM,UAAU,KAAK,cAAc;AAAA,IAKnC,IAAI,QAAQ,aAAa,IAAI,OAAO,QAAQ,GAAG;AAAA,MAC7C;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,QAAQ,WAAW,IAAI,OAAO,QAAQ;AAAA,IACxD,IAAI,CAAC,WAAW;AAAA,MACd;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,kBAAkB,cAAmB,QAAQ,SAAS;AAAA,MACtD,MAAM;AAAA,MACN;AAAA;AAAA,IAGF,IAAI,CAAC,KAAK,mBAAmB;AAAA,MAE3B,OAAO,mBAAmB,eAAe;AAAA,IAC3C;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,YAAY,wBAAwB,eAAe;AAAA,MACnD,MAAM;AAAA,MACN;AAAA;AAAA,IAGF,MAAM,SAAS,QAAQ,aAAa,IAAI,UAAU,UAAU;AAAA,IAC5D,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,YAAY,aAAsB,WAAW,MAAM;AAAA,MACnD,MAAM;AAAA,MACN;AAAA;AAAA,IAGF,OAAO,mBAAmB,SAAS;AAAA;AAEvC;AAWA,SAAS,gBAAgB,CAAC,SAA8B;AAAA,EACtD,MAAM,YAAqC;AAAA,IACzC,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA,IAAI,gBAAgB,WAAW,QAAQ,eAAe,WAAW;AAAA,IAC/D,UAAU,gBAAgB,QAAQ;AAAA,EACpC;AAAA,EACA,IAAI,WAAW,WAAW,QAAQ,UAAU,WAAW;AAAA,IACrD,UAAU,WAAW,QAAQ;AAAA,EAC/B;AAAA,EACA,IAAI,eAAe,WAAW,QAAQ,cAAc,WAAW;AAAA,IAC7D,UAAU,eAAe,QAAQ;AAAA,EACnC;AAAA,EACA,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,SAAS,CAAC;AAAA,EACtE,MAAM,YACJ,UAAU,WAAW,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,IAAI,WAAW,CAAC;AAAA,EAE3F,MAAM,MAAM,IAAI,WAAW,IAAI,YAAY,SAAS,UAAU,MAAM;AAAA,EACpE,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,WAAW,IAAI,YAAY,MAAM;AAAA,EACzC,OAAO;AAAA;AAMT,SAAS,kBAAkB,CAAC,OAA4B;AAAA,EACtD,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,MAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI,WAAW;AAAA,IAChC,MAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAAA,EACA,MAAM,SAAS,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC;AAAA,EACpF,MAAM,OAAO,MAAM,MAAM,IAAI,SAAS;AAAA,EACtC,OAAO,KAAK,QAAQ,KAAK;AAAA;;;AErQ3B,IAAM,0BAA0B;AAGhC,IAAM,yBAAyB;AAM/B,SAAS,UAAU,CAAC,KAAmD;AAAA,EACrE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,OAAO,QAAQ,WAAW,KAAK,MAAM,GAAG,IAAI;AAAA,IACrD,MAAM;AAAA,IACN;AAAA;AAAA,EAEF,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAAA,IACjD;AAAA,EACF;AAAA,EACA,MAAM,SAAS;AAAA,EACf,IAAI,OAAO,OAAO,YAAY,UAAU;AAAA,IACtC;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAAA;AAGF,MAAM,oBAAoB;AAAA,EACtB;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA,SAAS;AAAA,EACT,WAAW;AAAA,EACX;AAAA,EACS;AAAA,EAEjB,WAAW,CAAC,SAAqC;AAAA,IAC/C,KAAK,MAAM,QAAQ;AAAA,IACnB,KAAK,SAAS,QAAQ;AAAA,IACtB,KAAK,WAAW,QAAQ;AAAA,IACxB,IAAI,QAAQ,YAAY;AAAA,MAAW,KAAK,UAAU,QAAQ;AAAA,IAC1D,IAAI,QAAQ,WAAW;AAAA,MAAW,KAAK,SAAS,QAAQ;AAAA,IACxD,IAAI,QAAQ,YAAY;AAAA,MAAW,KAAK,UAAU,QAAQ;AAAA,IAC1D,IAAI,QAAQ,mBAAmB;AAAA,MAAW,KAAK,iBAAiB,QAAQ;AAAA,IACxE,IAAI,QAAQ,iBAAiB;AAAA,MAAW,KAAK,eAAe,QAAQ;AAAA,IACpE,IAAI,QAAQ,eAAe;AAAA,MAAW,KAAK,aAAa,QAAQ;AAAA,IAChE,IAAI,QAAQ,kBAAkB;AAAA,MAAW,KAAK,gBAAgB,QAAQ;AAAA,IACtE,MAAM,KAAK,QAAQ,aAAa,WAAW;AAAA,IAC3C,IAAI,OAAO,OAAO,YAAY;AAAA,MAC5B,MAAM,IAAI,MACR,iLACF;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AAAA;AAAA,OAQjB,QAAO,GAAkB;AAAA,IAC7B,KAAK,WAAW;AAAA,IAChB,IAAI,KAAK,gBAAgB;AAAA,MACvB,aAAa,KAAK,cAAc;AAAA,MAChC,KAAK,iBAAiB;AAAA,IACxB;AAAA,IACA,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,KAAK,IAAI,KAAK,cAAc,KAAK,GAAG;AAAA,MAC1C,KAAK,SAAS;AAAA,MACd,IAAI,UAAU;AAAA,MAEd,GAAG,iBAAiB,QAAQ,MAAM;AAAA,QAIhC,GAAG,KAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,QAAQ,KAAK,OAAO,CAA4B,CAAC;AAAA,QACxF,KAAK,SAAS;AAAA,QACd,KAAK,SAAS;AAAA,QACd,IAAI,CAAC,SAAS;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ;AAAA,QACV;AAAA,OACD;AAAA,MAED,GAAG,iBAAiB,WAAW,CAAC,UAAU;AAAA,QACxC,KAAK,cAAc,MAAM,IAAI;AAAA,OAC9B;AAAA,MAED,GAAG,iBAAiB,SAAS,CAAC,QAAQ;AAAA,QAGpC,IAAI,CAAC,SAAS;AAAA,UACZ,UAAU;AAAA,UACV,OAAO,GAAG;AAAA,QACZ;AAAA,OACD;AAAA,MAED,GAAG,iBAAiB,SAAS,MAAM;AAAA,QACjC,MAAM,UAAU,KAAK;AAAA,QACrB,KAAK,SAAS;AAAA,QACd,KAAK,UAAU;AAAA,QAIf,IAAI,CAAC,KAAK,YAAY,SAAS;AAAA,UAC7B,KAAK,kBAAkB,CAAC;AAAA,QAC1B;AAAA,OACD;AAAA,KACF;AAAA;AAAA,EAIK,iBAAiB,CAAC,SAAuB;AAAA,IAC/C,IAAI,KAAK;AAAA,MAAU;AAAA,IACnB,MAAM,QAAQ,KAAK,IAAI,wBAAwB,0BAA0B,KAAK,OAAO;AAAA,IACrF,KAAK,iBAAiB,WAAW,MAAM;AAAA,MACrC,KAAK,iBAAiB;AAAA,MACtB,IAAI,KAAK;AAAA,QAAU;AAAA,MACd,KAAK,QAAQ,EAAE,MAAM,MAAM;AAAA,QAC9B,KAAK,kBAAkB,UAAU,CAAC;AAAA,OACnC;AAAA,OACA,KAAK;AAAA;AAAA,EAQF,aAAa,CAAC,KAAoB;AAAA,IACxC,MAAM,SAAS,WAAW,GAAG;AAAA,IAC7B,IAAI,WAAW,WAAW;AAAA,MACxB;AAAA,IACF;AAAA,IACA,MAAM,UAAU,KAAK,eAAe,OAAO,OAAO;AAAA,IAClD,IAAI,YAAY,WAAW;AAAA,MACzB,QAAQ,MAAM;AAAA,MACd;AAAA,IACF;AAAA,IAKA,KAAK,gBAAgB,MAAyC;AAAA;AAAA,EAGxD,cAAc,CAAC,MAAwE;AAAA,IAC7F,IAAI,SAAS,UAAU;AAAA,MACrB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,SAAS,OAAO,WAAW,OAAO,UAAU;AAAA,QACnD;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,iBAAiB;AAAA,MAC5B,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,MAAM,QAAQ,OAAO,UAAU,GAAG;AAAA,UACpC,KAAK,iBAAiB,OAAO,UAAiC;AAAA,QAChE;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,eAAe;AAAA,MAC1B,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,eAAe,OAAO,SAAS;AAAA,QACtC;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,aAAa;AAAA,MACxB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,aAAa,OAAO,SAAS;AAAA,QACpC;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,SAAS;AAAA,MACpB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC;AAAA,QACF;AAAA,QACA,MAAM,eACJ,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,QACxE,KAAK,UAAU,OAAO,WAAW,YAAY;AAAA;AAAA,IAEjD;AAAA,IACA;AAAA;AAAA,EASF,UAAU,CAAC,cAAsB,SAA2B;AAAA,IAC1D,IAAI,CAAC,KAAK,UAAU,KAAK,OAAO,eAAe,KAAK,cAAc,QAAQ,CAAC,KAAK,QAAQ;AAAA,MACtF,OAAO;AAAA,IACT;AAAA,IACA,MAAM,MAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IACA,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IACpC,OAAO;AAAA;AAAA,EAaT,UAAU,CAAC,MAAc,UAAmC,CAAC,GAAY;AAAA,IACvE,IAAI,CAAC,KAAK,UAAU,KAAK,OAAO,eAAe,KAAK,cAAc,QAAQ,CAAC,KAAK,QAAQ;AAAA,MACtF,OAAO;AAAA,IACT;AAAA,IACA,KAAK,OAAO,KAAK,KAAK,UAAU,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,IACrD,OAAO;AAAA;AAAA,EAST,KAAK,GAAS;AAAA,IACZ,KAAK,WAAW;AAAA,IAChB,IAAI,KAAK,gBAAgB;AAAA,MACvB,aAAa,KAAK,cAAc;AAAA,MAChC,KAAK,iBAAiB;AAAA,IACxB;AAAA,IACA,KAAK,QAAQ,MAAM;AAAA,IACnB,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA;AAAA,MAIZ,WAAW,GAAY;AAAA,IACzB,OAAO,KAAK,UAAU,KAAK,QAAQ,eAAe,KAAK,cAAc;AAAA;AAEzE;;;ACzTA;AAAA;AAAA;AAAA;AAQA;;;ACZA;AACA;;;ACqBO,MAAM,uBAAuB,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,SACA,MACA,KACA,WACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,KAAK,YAAY;AAAA;AAErB;AAAA;AAOO,MAAM,kBAAkB;AAAA,EACZ,QAAQ,IAAI;AAAA,EAErB,QAAQ,CAAC,KAAa,WAAkC;AAAA,IAC9D,OAAO,GAAG,aAAa;AAAA;AAAA,EAIzB,IAAI,CAAC,KAAa,WAAgC;AAAA,IAChD,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,CAAC;AAAA;AAAA,EAI9C,QAAQ,CAAC,KAAa,WAAmC;AAAA,IACvD,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,CAAC;AAAA;AAAA,EAIrD,KAAK,GAAS;AAAA,IACZ,KAAK,MAAM,MAAM;AAAA;AAAA,MAIf,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,MAAM;AAAA;AAEtB;AAMO,IAAM,oBAAoB,IAAI;AAkBrC,eAAsB,gBAAqC,CACzD,QACA,aACA,WACe;AAAA,EACf,IAAK,WAAmC,aAAoC;AAAA,IAC1E,MAAM,IAAI,eACR,0CAA0C,OAAO,cAAc,OAAO,cACtE,2BACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,IAAI,kBAAkB,SAAS,OAAO,KAAK,OAAO,SAAS,GAAG;AAAA,IAC5D,MAAM,IAAI,eACR,2BAA2B,OAAO,eAAe,OAAO,6EACxD,oBACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AAAA,EACb,MAAM,YAAY;AAAA,EAClB,MAAM,cAAc,UAAU,OAAO,KAAK;AAAA,EAC1C,YAAY,QAAQ;AAAA,EACpB,kBAAkB,KAAK,OAAO,KAAK,OAAO,SAAS;AAAA;;;AC9G9C,MAAM,gCAAgC,MAAM;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,KACA,gBACA,eACA,iBACA,gBACA;AAAA,IACA,MAAM,gBAAgB,gBAAgB,QAAQ,mBAAmB;AAAA,IACjE,MAAM,iBAAiB,iBAAiB,QAAQ,oBAAoB;AAAA,IACpE,MACE,mCAAmC,mCACjC,IAAI,iBAAiB,iDACrB,OAAO,kBAAkB,6CACzB,wCACJ;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,KAAK,iBAAiB;AAAA,IACtB,KAAK,gBAAgB;AAAA,IACrB,KAAK,kBAAkB;AAAA,IACvB,KAAK,iBAAiB;AAAA;AAE1B;AAAA;AAaO,MAAM,kBAAkB;AAAA,EACZ,UAAU,IAAI;AAAA,EAU/B,QAAQ,CAAC,KAAa,WAA0B,UAAyB;AAAA,IACvE,MAAM,WAAW,KAAK,QAAQ,IAAI,GAAG;AAAA,IACrC,IAAI,YAAY,SAAS,cAAc,WAAW;AAAA,MAChD,MAAM,IAAI,wBACR,KACA,SAAS,WACT,SAAS,UACT,WACA,QACF;AAAA,IACF;AAAA,IACA,IAAI,CAAC,UAAU;AAAA,MACb,KAAK,QAAQ,IAAI,KAAK,EAAE,WAAW,SAAS,CAAC;AAAA,IAC/C;AAAA;AAAA,EAMF,GAAG,CAAC,KAAsB;AAAA,IACxB,OAAO,KAAK,QAAQ,IAAI,GAAG;AAAA;AAAA,EAO7B,MAAM,CAAC,KAAwC;AAAA,IAC7C,OAAO,KAAK,QAAQ,IAAI,GAAG,GAAG;AAAA;AAAA,EAOhC,KAAK,GAAS;AAAA,IACZ,KAAK,QAAQ,MAAM;AAAA;AAAA,MAMjB,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,QAAQ;AAAA;AAExB;AAMO,IAAM,oBAAoB,IAAI;;;ACxH9B,IAAM,uBAAuB;AAAA;AA2C7B,MAAM,2BAA2B,MAAM;AAAA,EACnC;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,SACA,MACA,UAKI,CAAC,GACL;AAAA,IACA,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,IAAI,QAAQ,eAAe;AAAA,MAAW,KAAK,aAAa,QAAQ;AAAA,IAChE,IAAI,QAAQ,kBAAkB;AAAA,MAAW,KAAK,gBAAgB,QAAQ;AAAA,IACtE,IAAI,QAAQ,cAAc;AAAA,MAAW,KAAK,YAAY,QAAQ;AAAA,IAC9D,IAAI,QAAQ,mBAAmB;AAAA,MAAW,KAAK,iBAAiB,QAAQ;AAAA;AAE5E;AAQO,SAAS,aAAa,CAAC,KAAsB;AAAA,EAClD,IAAI,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAAM,OAAO;AAAA,EACpD,MAAM,SAAS;AAAA,EACf,MAAM,QAAQ,OAAO;AAAA,EACrB,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS,IAAI,QAAQ;AAAA;AAO/E,SAAS,aAAa,CAAC,KAA8B,SAAuB;AAAA,EACjF,IAAI,wBAAwB;AAAA;AAWvB,SAAS,aAAa,CAC3B,KACA,eACA,YACM;AAAA,EACN,MAAM,UAAU,cAAc,GAAG;AAAA,EACjC,IAAI,UAAU,eAAe;AAAA,IAC3B,MAAM,IAAI,mBACR,iCAAiC,uCAAuC,uDACxE,oBACA,EAAE,YAAY,SAAS,cAAc,CACvC;AAAA,EACF;AAAA,EACA,SAAS,IAAI,UAAU,EAAG,KAAK,eAAe,KAAK;AAAA,IACjD,MAAM,YAAY,WAAW;AAAA,IAC7B,IAAI,CAAC,WAAW;AAAA,MACd,MAAM,IAAI,mBACR,wCAAwC,yCAAyC,UAAU,aAAa,kBACxG,qBACA,EAAE,YAAY,SAAS,eAAe,gBAAgB,EAAE,CAC1D;AAAA,IACF;AAAA,IACA,UAAU,GAAG;AAAA,IACb,cAAc,KAAK,CAAC;AAAA,EACtB;AAAA;AAuBK,SAAS,cAAc,CAAC,WAAmB,YAAoC;AAAA,EACpF,IAAI,YAAY,YAAY;AAAA,IAC1B,OAAO,EAAE,YAAY,OAAO,QAAQ,qBAAqB,WAAW,WAAW;AAAA,EACjF;AAAA,EACA,IAAI,YAAY,YAAY;AAAA,IAC1B,OAAO,EAAE,YAAY,OAAO,QAAQ,qBAAqB,WAAW,WAAW;AAAA,EACjF;AAAA,EACA,OAAO,EAAE,YAAY,KAAK;AAAA;AAQrB,SAAS,eAAe,CAAC,WAAmB,YAA0B;AAAA,EAC3E,MAAM,SAAS,eAAe,WAAW,UAAU;AAAA,EACnD,IAAI,OAAO;AAAA,IAAY;AAAA,EACvB,MAAM,UACJ,OAAO,WAAW,sBACd,8CAA8C,4CAA4C,8CAC1F,8CAA8C,4CAA4C;AAAA,EAChG,MAAM,IAAI,mBAAmB,SAAS,OAAO,QAAQ,EAAE,WAAW,WAAW,CAAC;AAAA;;;AH1HhF,SAAS,0BAAqD,CAC5D,QACyB;AAAA,EACzB,IAAI,kBAAkB,SAAS,OAAO,KAAK,OAAO,SAAS,GAAG;AAAA,IAC5D,MAAM,IAAI,eACR,qBAAqB,OAAO,cAAc,OAAO,+GACjD,oBACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,kBAAkB,SAAS,OAAO,KAAK,OAAO,WAAW,OAAO,QAAQ;AAAA,EAExE,MAAM,QAAQ,OAAU,OAAO,YAAY;AAAA,EAC3C,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,EAEJ,MAAM,UAAU,YAAY;AAAA,IAC1B,MAAM,SAAS,MAAM,OAAO,UAAU;AAAA,IACtC,MAAM,OAAO,UAAU;AAAA,IACvB,gBAAgB;AAAA,IAEhB,IAAI,OAAO,kBAAkB,WAAW;AAAA,MACtC,MAAM,gBAAgB,OAAO;AAAA,MAC7B,MAAM,aAAa,OAAO,cAAc,CAAC;AAAA,MACzC,OAAO,OAAO,CAAC,QAAQ;AAAA,QACrB,cAAc,KAA2C,eAAe,UAAU;AAAA,QAClF,cAAc,KAA2C,aAAa;AAAA,OACvE;AAAA,IACH;AAAA,IAEA,WAAW;AAAA,IACX,IAAI;AAAA,MACF,MAAM,QAAQ,OAAO,aAAa,OAAO,IAAI,CAAC;AAAA,cAC9C;AAAA,MACA,WAAW;AAAA;AAAA,IAGb,OAAO,GAAG,UAAU,CAAC,YAAY;AAAA,MAC/B,IAAI;AAAA,QAAU;AAAA,MACd,WAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM,QAAQ,OAAO,aAAa,QAAQ,GAAG;AAAA,gBAC7C;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA,IAED,OAAO,MAAM;AAAA,MACX,MAAM,QAAQ,MAAM;AAAA,MACpB,IAAI;AAAA,QAAU;AAAA,MACd,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,cAAc,OAAO,CAAC,QAAQ;AAAA,UAC5B,OAAO,WAAW,KAAK,KAAK;AAAA,SAC7B;AAAA,gBACD;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA,KACA;AAAA,EAEH,OAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,WAAW,OAAO;AAAA,QACd,KAAK,GAAG;AAAA,MACV,OAAO,MAAM;AAAA;AAAA,QAEX,KAAK,CAAC,MAAS;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,IAEhB;AAAA,QACI,MAAM,GAAG;AAAA,MACX,OAAO;AAAA;AAAA,EAEX;AAAA;AA2BK,SAAS,SAAS,CACvB,KACA,cACA,SAC8B;AAAA,EAC9B,OAAO,2BAA4C;AAAA,IACjD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAQ,IAAI,QAAQ;AAAA,IACnC,YAAY,CAAC,KAAK,UAAU;AAAA,MAC1B,IAAI,IAAI,SAAS,WAAW;AAAA,QAEzB,IAA2B,OAAO;AAAA,MACrC,EAAO;AAAA,QACL,WAAW,KAAK,CAAC,MAAM,GAAG,KAAK;AAAA;AAAA;AAAA,IAGnC,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;AA8BI,SAAS,YAAY,CAC1B,KACA,cACA,SAC8B;AAAA,EAC9B,OAAO,2BAA+C;AAAA,IACpD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAQ;AAAA,MACrB,MAAM,IAAI,IAAI;AAAA,MACd,IAAI,MAAM;AAAA,QAAW,OAAO;AAAA,MAC5B,OAAO,EAAE;AAAA;AAAA,IAEX,YAAY,CAAC,KAAK,UAAU;AAAA,MAC1B,MAAM,WAAW,IAAI;AAAA,MACrB,IAAI,aAAa,WAAW;AAAA,QACzB,IAA8B,QAAQ,IAAI,QAAQ,KAAK;AAAA,MAC1D,EAAO;AAAA,QACL,MAAM,QAAQ,QAAQ,SAAS;AAAA,QAC/B,IAAI,UAAU,GAAG;AAAA,UACf,SAAS,UAAU,KAAK;AAAA,QAC1B;AAAA;AAAA;AAAA,IAGJ,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;AA8BI,SAAS,SAAY,CAC1B,KACA,cACA,SAC2B;AAAA,EAC3B,OAAO,2BAA4C;AAAA,IACjD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAS,IAAI,QAAQ,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;AAAA,IACtD,YAAY,CAAC,KAAK,UAAU;AAAA,MAGzB,IAA8B,QAAQ,CAAC,GAAG,KAAK;AAAA;AAAA,IAElD,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;;;AInSH,mBAAS,mBAAQ;AAsEV,SAAS,UAAkC,CAAC,SAAgD;AAAA,EACjG,IAAI,kBAAkB,SAAS,QAAQ,KAAK,QAAQ,SAAS,GAAG;AAAA,IAC9D,MAAM,IAAI,eACR,qBAAqB,QAAQ,cAAc,QAAQ,+GACnD,oBACA,QAAQ,KACR,QAAQ,SACV;AAAA,EACF;AAAA,EACA,kBAAkB,SAAS,QAAQ,KAAK,QAAQ,WAAW,QAAQ,QAAQ;AAAA,EAE3E,MAAM,QAAQ,QAAU,QAAQ,YAAY;AAAA,EAC5C,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,EAEJ,MAAM,UAAU,YAAY;AAAA,IAC1B,MAAM,SAAS,MAAM,QAAQ,UAAU;AAAA,IACvC,MAAM,OAAO,UAAU;AAAA,IACvB,gBAAgB;AAAA,IAIhB,IAAI,QAAQ,kBAAkB,WAAW;AAAA,MACvC,MAAM,gBAAgB,QAAQ;AAAA,MAC9B,MAAM,aAAa,QAAQ,cAAc,CAAC;AAAA,MAC1C,OAAO,OAAO,CAAC,QAAQ;AAAA,QACrB,cAAc,KAA2C,eAAe,UAAU;AAAA,QAGlF,cAAc,KAA2C,aAAa;AAAA,OACvE;AAAA,IACH;AAAA,IAIA,WAAW;AAAA,IACX,IAAI;AAAA,MACF,MAAM,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,cACnC;AAAA,MACA,WAAW;AAAA;AAAA,IAIb,OAAO,GAAG,UAAU,CAAC,YAAY;AAAA,MAC/B,IAAI;AAAA,QAAU;AAAA,MACd,WAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM,QAAQ,SAAS,QAAQ,GAAG;AAAA,gBAClC;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA,IAMD,QAAO,MAAM;AAAA,MACX,MAAM,QAAQ,MAAM;AAAA,MACpB,IAAI;AAAA,QAAU;AAAA,MACd,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,cAAc,OAAO,CAAC,QAAQ;AAAA,UAC5B,cAAc,KAA2C,KAAK;AAAA,SAC/D;AAAA,gBACD;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA,KACA;AAAA,EAEH,OAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,QACf,KAAK,GAAG;AAAA,MACV,OAAO,MAAM;AAAA;AAAA,QAEX,KAAK,CAAC,MAAS;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,IAEhB;AAAA,QACI,MAAM,GAAG;AAAA,MACX,OAAO;AAAA;AAAA,EAEX;AAAA;AAQF,SAAS,QAAW,CAAC,KAAW;AAAA,EAC9B,OAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA;AA6BvC,SAAS,aAAqC,CAAC,KAA8B,OAAgB;AAAA,EAC3F,MAAM,SAAS;AAAA,EACf,WAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAAA,IACpC,IAAI,QAAQ;AAAA,MAAsB;AAAA,IAClC,MAAM,WAAW,OAAO;AAAA,IACxB,IAAI,YAAY,IAAI,MAAM,QAAQ;AAAA,MAAG;AAAA,IACrC,IAAI,OAAO;AAAA,EACb;AAAA;AAQF,SAAS,WAAW,CAAC,GAAY,GAAqB;AAAA,EACpD,IAAI,MAAM;AAAA,IAAG,OAAO;AAAA,EACpB,IAAI;AAAA,IACF,OAAO,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;ALlKX,IAAI;AAQG,SAAS,kBAAkB,CAAC,MAAkB;AAAA,EACnD,cAAc;AAAA;AAOT,SAAS,cAAc,GAAS;AAAA,EACrC,cAAc;AAAA;AAGhB,SAAS,WAAW,CAAC,QAAgC;AAAA,EACnD,MAAM,OAAO,UAAU;AAAA,EACvB,IAAI,CAAC,MAAM;AAAA,IACT,MAAM,IAAI,MACR,2HACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAWT,IAAM,gBAAgB;AACtB,IAAM,aAAa,IAAI;AAEvB,SAAS,gBAAgB,CAAC,KAAyB;AAAA,EACjD,MAAM,SAAS,MAAK,KAAK,WAAW,OAAO,GAAG,iBAAiB,KAAK,CAAC;AAAA,EACrE,MAAM,QAAQ,OAAO,MAAM,GAAG,EAAE;AAAA,EAChC,OAAO,sBAAsB,KAAoC;AAAA;AAanE,SAAS,kBAAqB,CAC5B,MACA,KACA,YAC6B;AAAA,EAC7B,MAAM,aAAa,iBAAiB,GAAG;AAAA,EACvC,OAAO,YAAY;AAAA,IACjB,MAAM,SAAS,KAAK,QAAQ;AAAA,IAC5B,IAAI,QAAQ;AAAA,MACV,MAAM,OAAO,UAAU,CAAC,SAAS,aAAa,CAAC;AAAA,MAC/C,IAAI,OAAO,UAAU,SAAS;AAAA,QAC5B,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,SAAS,MAAM,KAAK,kBAAkB,QAAW,UAAU;AAAA,IACjE,IAAI,QAAQ;AAAA,MACV,OAAO,KAAK,KAAQ,YAAY,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;AAAA,IAChE;AAAA,IACA,MAAM,SAAS,UAAU,KAAK,UAAU,KAAK,UAAgD,CAAC;AAAA,IAC9F,MAAM,SAAS,KAAK,OAAU,QAAQ,EAAE,OAAO,WAAW,CAAC;AAAA,IAC3D,OAAO,YAAY;AAAA,IACnB,OAAO;AAAA;AAAA;AAmBJ,SAAS,UAAkC,CAChD,KACA,cACA,UAA4B,CAAC,GACX;AAAA,EAClB,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,WAAc;AAAA,IACnB;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,WAAW,mBAAsB,MAAM,KAAK,YAAY;AAAA,IACxD,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAAA;AAWI,SAAS,SAAS,CACvB,KACA,cACA,UAA4B,CAAC,GACC;AAAA,EAC9B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,UAAU,KAAK,cAAc;AAAA,IAClC,WAAW;AAAA,IACX,WAAW,mBAA4B,MAAM,KAAK,EAAE,MAAM,aAAa,CAAC;AAAA,IACxE,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAAA;AAUI,SAAS,YAAY,CAC1B,KACA,cACA,UAA4B,CAAC,GACC;AAAA,EAC9B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,aAAa,KAAK,cAAc;AAAA,IACrC,WAAW;AAAA,IACX,WAAW,mBAA+B,MAAM,KAAK,CAAC,CAAC;AAAA,IACvD,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAAA;AAWI,SAAS,SAAY,CAC1B,KACA,cACA,UAA4B,CAAC,GACF;AAAA,EAC3B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,UAAa,KAAK,cAAc;AAAA,IACrC,WAAW;AAAA,IACX,WAAW,mBAA+B,MAAM,KAAK,EAAE,OAAO,aAAa,CAAC;AAAA,IAC5E,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAAA;;;AMjNH;AAAA,oBAEE;AAAA;AAUK,IAAM,sBAAsC;AAAA,EACjD,EAAE,MAAM,+BAA+B;AAAA,EACvC,EAAE,MAAM,gCAAgC;AAC1C;AAAA;AAqDO,MAAM,0BAA0B,gBAAe;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EAKQ;AAAA,EAKA,eAAe,IAAI;AAAA,EAOnB;AAAA,EACA;AAAA,EACA,QAAQ,IAAI;AAAA,EACrB,QAAQ;AAAA,EACR;AAAA,MAMJ,YAAY,GAAa;AAAA,IAC3B,OAAO,CAAC,GAAG,KAAK,UAAU;AAAA;AAAA,EAM5B;AAAA,EAEA,WAAW,CAAC,SAAmC;AAAA,IAC7C,MAAM;AAAA,IACN,KAAK,YAAY,QAAQ;AAAA,IACzB,KAAK,aAAa,QAAQ,cAAc;AAAA,IACxC,KAAK,mBAAmB,QAAQ,oBAAoB;AAAA,IACpD,KAAK,aAAa,IAAI,IAAI,QAAQ,gBAAgB,CAAC,CAAC;AAAA,IACpD,KAAK,cAAc,QAAQ;AAAA,IAC3B,MAAM,KAAK,QAAQ,qBAAqB,WAAW;AAAA,IACnD,IAAI,OAAO,OAAO,YAAY;AAAA,MAC5B,MAAM,IAAI,MACR,+MACF;AAAA,IACF;AAAA,IACA,KAAK,wBAAwB;AAAA;AAAA,EAG/B,OAAO,GAAY;AAAA,IACjB,OAAO,KAAK;AAAA;AAAA,EAOd,aAAa,GAAW;AAAA,IACtB,OAAO,KAAK,MAAM;AAAA;AAAA,EAWpB,gBAAgB,CAAC,cAA4B;AAAA,IAC3C,KAAK,aAAa,IAAI,YAAY;AAAA,IAClC,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,MAAG;AAAA,IAC1C,KAAK,qBAAqB,YAAY;AAAA;AAAA,EAOxC,kBAAkB,CAAC,SAAyB;AAAA,IAC1C,WAAW,gBAAgB,SAAS;AAAA,MAClC,KAAK,aAAa,IAAI,YAAY;AAAA,MAClC,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,QAAG;AAAA,MAC1C,KAAK,qBAAqB,YAAY;AAAA,IACxC;AAAA;AAAA,EASF,cAAc,CAAC,cAA4B;AAAA,IACzC,KAAK,aAAa,OAAO,YAAY;AAAA,IACrC,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY;AAAA,IACxC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,KAAK,SAAS,MAAM;AAAA,IACpB,KAAK,WAAW,MAAM;AAAA,IACtB,KAAK,MAAM,OAAO,YAAY;AAAA;AAAA,EAWhC,YAAY,CAAC,cAA4B;AAAA,IACvC,IAAI,iBAAiB,KAAK;AAAA,MAAa;AAAA,IACvC,IAAI,KAAK,WAAW,IAAI,YAAY;AAAA,MAAG;AAAA,IACvC,KAAK,WAAW,IAAI,YAAY;AAAA,IAChC,IAAI,CAAC,KAAK,aAAa,IAAI,YAAY;AAAA,MAAG;AAAA,IAC1C,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,MAAG;AAAA,IAC1C,KAAK,qBAAqB,YAAY;AAAA;AAAA,EAGhC,gBAAgB,CAAC,cAA+B;AAAA,IACtD,IAAI,iBAAiB,KAAK;AAAA,MAAa,OAAO;AAAA,IAC9C,IAAI,CAAC,KAAK,WAAW,IAAI,YAAY;AAAA,MAAG,OAAO;AAAA,IAC/C,IAAI,KAAK,MAAM,IAAI,YAAY;AAAA,MAAG,OAAO;AAAA,IAKzC,IAAI,KAAK,eAAe;AAAA,MAAc,OAAO;AAAA,IAC7C,OAAO;AAAA;AAAA,EAGT,SAAS,GAAkB;AAAA,IACzB,IAAI,KAAK;AAAA,MAAO,OAAO,QAAQ,QAAQ;AAAA,IACvC,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,gBAAgB;AAAA,KACtB;AAAA;AAAA,EAeH,OAAO,CAAC,QAAgB,cAAmC;AAAA,IACzD,KAAK,SAAS;AAAA,IACd,IAAI,iBAAiB,WAAW;AAAA,MAC9B,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,KAAK,QAAQ;AAAA,IACb,KAAK,gBAAgB;AAAA;AAAA,EAGvB,UAAU,GAAS;AAAA,IACjB,WAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AAAA,MACtC,KAAK,SAAS,MAAM;AAAA,MACpB,KAAK,WAAW,MAAM;AAAA,IACxB;AAAA,IACA,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,QAAQ;AAAA,IACb,KAAK,KAAK,OAAO;AAAA;AAAA,EASnB,IAAI,CAAC,SAAwB;AAAA,IAC3B,MAAM,WAAW,QAAQ;AAAA,IACzB,MAAM,QAAQ,KAAK,iBAAiB,OAAO;AAAA,IAC3C,IAAI,OAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,IAClC,IAAI,CAAC,MAAM;AAAA,MACT,OAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC3C;AAAA,IACA,IAAI,KAAK,WAAW,KAAK,QAAQ,eAAe,QAAQ;AAAA,MACtD,KAAK,QAAQ,KAAK,KAAK;AAAA,IACzB,EAAO;AAAA,MACL,KAAK,aAAa,KAAK,KAAK;AAAA;AAAA;AAAA,EAYhC,YAAY,CAAC,YAAoB,YAA2B;AAAA,IAC1D,MAAM,UAAU;AAAA,IAChB,IAAI,CAAC,WAAW,OAAO,YAAY,YAAY,EAAE,UAAU,UAAU;AAAA,MACnE;AAAA,IACF;AAAA,IACA,QAAQ,QAAQ;AAAA,WACT;AAAA,QACE,KAAK,YAAY,YAAY,QAAQ,GAAG;AAAA,QAC7C;AAAA,WACG;AAAA,QACE,KAAK,aAAa,YAAY,QAAQ,GAAG;AAAA,QAC9C;AAAA,WACG;AAAA,QACE,KAAK,mBAAmB,YAAY,QAAQ,SAAS;AAAA,QAC1D;AAAA;AAAA;AAAA,EAIE,oBAAoB,CAAC,UAA4B;AAAA,IACvD,MAAM,aAAa,IAAI,KAAK,sBAAsB,EAAE,YAAY,KAAK,WAAW,CAAC;AAAA,IACjF,MAAM,UAAU,WAAW,kBAAkB,KAAK,kBAAkB,EAAE,SAAS,KAAK,CAAC;AAAA,IACrF,MAAM,OAAiB,EAAE,YAAY,SAAS,cAAc,CAAC,EAAE;AAAA,IAC/D,KAAK,MAAM,IAAI,UAAU,IAAI;AAAA,IAC7B,KAAK,eAAe,UAAU,UAAU;AAAA,IACxC,KAAK,gBAAgB,UAAU,OAAO;AAAA,IACjC,KAAK,cAAc,UAAU,UAAU;AAAA,IAC5C,OAAO;AAAA;AAAA,OAGK,cAAa,CAAC,UAAkB,YAA8C;AAAA,IAC1F,MAAM,QAAQ,MAAM,WAAW,YAAY;AAAA,IAC3C,MAAM,WAAW,oBAAoB,KAAK;AAAA,IAC1C,KAAK,UAAU,WAAW,UAAU,EAAE,MAAM,SAAS,KAAK,MAAM,CAA4B;AAAA;AAAA,OAGhF,YAAW,CAAC,YAAoB,KAA+C;AAAA,IAC3F,MAAM,WAAW,KAAK,MAAM,IAAI,UAAU;AAAA,IAC1C,IAAI,UAAU;AAAA,MAKZ,MAAM,UAAU,KAAK;AAAA,MACrB,IAAI,UAAU,YAAY;AAAA,QACxB;AAAA,MACF;AAAA,MACA,SAAS,SAAS,MAAM;AAAA,MACxB,SAAS,WAAW,MAAM;AAAA,MAC1B,KAAK,MAAM,OAAO,UAAU;AAAA,IAC9B;AAAA,IAEA,MAAM,aAAa,IAAI,KAAK,sBAAsB,EAAE,YAAY,KAAK,WAAW,CAAC;AAAA,IACjF,MAAM,OAAiB,EAAE,YAAY,SAAS,WAAW,cAAc,CAAC,EAAE;AAAA,IAC1E,KAAK,MAAM,IAAI,YAAY,IAAI;AAAA,IAC/B,KAAK,eAAe,YAAY,UAAU;AAAA,IAC1C,WAAW,gBAAgB,CAAC,UAAU;AAAA,MACpC,KAAK,UAAU,MAAM;AAAA,MACrB,KAAK,gBAAgB,YAAY,MAAM,OAAO;AAAA;AAAA,IAEhD,MAAM,WAAW,qBAAqB,GAAG;AAAA,IACzC,MAAM,SAAS,MAAM,WAAW,aAAa;AAAA,IAC7C,MAAM,WAAW,oBAAoB,MAAM;AAAA,IAC3C,KAAK,UAAU,WAAW,YAAY;AAAA,MACpC,MAAM;AAAA,MACN,KAAK;AAAA,IACP,CAA4B;AAAA;AAAA,OAGhB,aAAY,CAAC,YAAoB,KAA+C;AAAA,IAC5F,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IAOX,IAAI,KAAK,WAAW,mBAAmB;AAAA,MAAoB;AAAA,IAC3D,MAAM,KAAK,WAAW,qBAAqB,GAAG;AAAA;AAAA,OAGlC,mBAAkB,CAC9B,YACA,WACe;AAAA,IACf,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,IAAI;AAAA,MACF,MAAM,KAAK,WAAW,gBAAgB,SAAS;AAAA,MAC/C,MAAM;AAAA;AAAA,EAMF,cAAc,CAAC,QAAgB,YAAqC;AAAA,IAC1E,WAAW,iBAAiB,CAAC,UAAU;AAAA,MACrC,IAAI,MAAM,WAAW;AAAA,QACnB,KAAK,UAAU,WAAW,QAAQ;AAAA,UAChC,MAAM;AAAA,UACN,WAAW,MAAM,UAAU,OAAO;AAAA,QACpC,CAA4B;AAAA,MAC9B;AAAA;AAAA,IAEF,WAAW,0BAA0B,MAAM;AAAA,MACzC,MAAM,QAAQ,WAAW;AAAA,MACzB,IAAI,UAAU,aAAa;AAAA,QACzB,KAAK,KAAK,kBAAkB;AAAA,UAC1B;AAAA,UACA,cAAc,CAAC;AAAA,QACjB,CAAC;AAAA,MACH,EAAO,SAAI,UAAU,kBAAkB,UAAU,YAAY,UAAU,UAAU;AAAA,QAC/E,KAAK,MAAM,OAAO,MAAM;AAAA,QACxB,KAAK,KAAK,qBAAqB,EAAE,OAAoC,CAAC;AAAA,MACxE;AAAA;AAAA;AAAA,EAII,eAAe,CAAC,QAAgB,SAA+B;AAAA,IACrE,QAAQ,SAAS,MAAM;AAAA,MACrB,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,CAAC;AAAA,QAAM;AAAA,MAGX,WAAW,SAAS,KAAK,cAAc;AAAA,QACrC,QAAQ,KAAK,KAAK;AAAA,MACpB;AAAA,MACA,KAAK,eAAe,CAAC;AAAA;AAAA,IAEvB,QAAQ,YAAY,CAAC,UAAU;AAAA,MAC7B,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI,gBAAgB,aAAa;AAAA,QAC/B,KAAK,gBAAgB,QAAQ,IAAI,WAAW,IAAI,CAAC;AAAA,MACnD,EAAO,SAAI,gBAAgB,YAAY;AAAA,QACrC,KAAK,gBAAgB,QAAQ,IAAI;AAAA,MACnC;AAAA;AAAA,IAIF,QAAQ,UAAU,MAAM;AAAA,MACtB,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,MAAM,YAAY,SAAS;AAAA,QAC7B,KAAK,UAAU;AAAA,MACjB;AAAA;AAAA;AAAA,EAII,eAAe,CAAC,YAAoB,OAAyB;AAAA,IACnE,IAAI;AAAA,MAIF,IAAI,KAAK,iBAAiB,kBAAkB,KAAK,GAAG;AAAA,QAClD,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,QAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,QACzC,MAAM,SAAS,KAAK,MAClB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAC3D;AAAA,QACA,MAAM,OAAO,MAAM,SAAS,IAAI,SAAS;AAAA,QACzC,KAAK,cAAc,YAAY,QAAQ,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,MACA,MAAM,UAAU,KAAK,mBAAmB,KAAK;AAAA,MAC7C,KAAK,KAAK,WAAW,OAAO;AAAA,MAC5B,MAAM;AAAA;AAAA,MAQN,gBAAgB,GAAa;AAAA,IAC/B,MAAM,MAAgB,CAAC;AAAA,IACvB,YAAY,QAAQ,SAAS,KAAK,OAAO;AAAA,MACvC,IAAI,KAAK,WAAW,KAAK,QAAQ,eAAe,QAAQ;AAAA,QACtD,IAAI,KAAK,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAMT,eAAe,CAAC,QAAgB,OAAyC;AAAA,IACvE,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC,MAAM,WAAW,KAAK,QAAQ,eAAe;AAAA,MAAQ,OAAO;AAAA,IACjE,OAAO,KAAK,iBAAiB,KAAK,SAAS,KAAK;AAAA;AAAA,EAK1C,gBAAgB,CAAC,SAAyB,OAAyC;AAAA,IAEzF,IAAI,QAAQ,iBAAiB,MAAM;AAAA,MAAM,OAAO;AAAA,IAChD,QAAQ,KAAK,KAAK;AAAA,IAClB,OAAO;AAAA;AAAA,EASD,gBAAgB,CAAC,SAA2C;AAAA,IAClE,MAAM,YAAqC;AAAA,MACzC,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,IACpB;AAAA,IACA,IAAI,gBAAgB,WAAW,QAAQ,eAAe,WAAW;AAAA,MAC/D,UAAU,gBAAgB,QAAQ;AAAA,IACpC;AAAA,IACA,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,SAAS,CAAC;AAAA,IACtE,MAAM,YACJ,UAAU,WAAW,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,IAAI,WAAW,CAAC;AAAA,IAC3F,MAAM,OAAO,IAAI,YAAY,SAAS,UAAU;AAAA,IAChD,MAAM,SAAS,IAAI,YAAY,IAAI;AAAA,IACnC,MAAM,MAAM,IAAI,WAAW,MAAM;AAAA,IACjC,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,IAChC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,IAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,IACtB,IAAI,IAAI,WAAW,IAAI,YAAY,MAAM;AAAA,IACzC,OAAO;AAAA;AAAA,EAID,kBAAkB,CAAC,OAA4B;AAAA,IACrD,IAAI,MAAM,SAAS,GAAG;AAAA,MACpB,MAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAAA,IACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,IAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,IACzC,IAAI,MAAM,SAAS,IAAI,WAAW;AAAA,MAChC,MAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,IACA,MAAM,SAAS,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC;AAAA,IACpF,MAAM,OAAO,MAAM,MAAM,IAAI,SAAS;AAAA,IACtC,OAAO,KAAK,QAAQ,KAAK;AAAA;AAE7B;;;AVvbA,eAAsB,iBAAiB,CACrC,KACqC;AAAA,EACrC,IAAI,KAAK,uBAAuB;AAAA,IAC9B,OAAO,IAAI,sBAAsB;AAAA,EACnC;AAAA,EACA,OAAO,KAAK;AAAA;AAmCd,eAAsB,gBAAgB,CAAC,SAAuD;AAAA,EAC5F,MAAM,gBAAgB,MAAM,qBAAqB,QAAQ,OAAO;AAAA,EAChE,MAAM,UAAU,cAAc;AAAA,EAC9B,MAAM,oBAAoB,QAAQ,qBAAqB;AAAA,EAKvD,IAAI,qBAAqB,CAAC,QAAQ,aAAa,IAAI,mBAAmB,GAAG;AAAA,IACvE,MAAM,IAAI,MACR,oFAAoF,2GACtF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,CAAC,GAAG,QAAQ,WAAW,KAAK,CAAC,EAAE,OAClD,CAAC,OAAO,OAAO,QAAQ,UAAU,MACnC;AAAA,EAMA,MAAM,qBAAqB,MAAM,kBAAkB,QAAQ,GAAG;AAAA,EAE9D,MAAM,uBAAiD;AAAA,IACrD,WAAW;AAAA,IACX,QAAQ,QAAQ,UAAU;AAAA,IAC1B;AAAA,OACI,uBAAuB,aAAa,EAAE,YAAY,mBAAmB;AAAA,OACrE,QAAQ,KAAK,qBAAqB,aAAa;AAAA,MACjD,kBAAkB,QAAQ,IAAI;AAAA,IAChC;AAAA,OACI,QAAQ,KAAK,sBAAsB,aAAa;AAAA,MAClD,mBAAmB,QAAQ,IAAI;AAAA,IACjC;AAAA,EACF;AAAA,EAUA,IAAI;AAAA,EACJ,MAAM,YAAY,IAAI,oBAAoB;AAAA,IACxC,KAAK,QAAQ,UAAU;AAAA,IACvB,QAAQ,QAAQ,UAAU;AAAA,OACtB,QAAQ,UAAU,cAAc,aAAa,EAAE,WAAW,QAAQ,UAAU,UAAU;AAAA,OACtF,QAAQ,UAAU,YAAY,aAAa,EAAE,SAAS,QAAQ,UAAU,QAAQ;AAAA,OAChF,QAAQ,UAAU,kBAAkB,aAAa;AAAA,MACnD,eAAe,QAAQ,UAAU;AAAA,IACnC;AAAA,IACA,UAAU,CAAC,YAAY,YAAY;AAAA,MACjC,eAAe,aAAa,YAAY,OAAO;AAAA;AAAA,IAEjD,gBAAgB,CAAC,YAAY;AAAA,MAC3B,eAAe,mBAAmB,OAAO;AAAA;AAAA,IAE3C,cAAc,CAAC,WAAW;AAAA,MACxB,eAAe,iBAAiB,MAAM;AAAA;AAAA,IAExC,YAAY,CAAC,WAAW;AAAA,MACtB,eAAe,eAAe,MAAM;AAAA;AAAA,EAExC,CAAC;AAAA,EAED,qBAAqB,YAAY;AAAA,EACjC,gBAAgB,IAAI,kBAAkB,oBAAoB;AAAA,EAE1D,MAAM,iBAAiB,IAAI,mBAAmB;AAAA,IAC5C,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EASD,MAAM,OAAO,IAAI,KAAK;AAAA,IACpB,SAAS,CAAC,cAAc;AAAA,IACxB,QAAQ,QAAQ,UAAU;AAAA,OACtB,QAAQ,gBAAgB,aAAa,EAAE,SAAS,QAAQ,YAAY;AAAA,EAC1E,CAAC;AAAA,EAED,mBAAmB,IAAI;AAAA,EAEvB,MAAM,UAAU,QAAQ;AAAA,EAExB,OAAO;AAAA,IACL;AAAA,QACI,OAAO,GAAgB;AAAA,MACzB,OAAO,cAAc;AAAA;AAAA,IAEvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,YAAY;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,eAAe,WAAW;AAAA,MAC1B,MAAM,KAAK,SAAS;AAAA;AAAA,EAExB;AAAA;AAGF,eAAe,oBAAoB,CACjC,QAC4B;AAAA,EAC5B,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,YAAY,QAAQ;AAAA,IACvE,OAAO,OAAO;AAAA,EAChB;AAAA,EACA,IAAI,aAAa,QAAQ;AAAA,IACvB,MAAM,SAAS,MAAM,OAAO,QAAQ,KAAK;AAAA,IACzC,IAAI,WAAW,MAAM;AAAA,MACnB,MAAM,IAAI,MACR,qRACF;AAAA,IACF;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AAAA,EACA,OAAO,MAAM;AAAA;;AW9Pf;AASO,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC;AAGnE,IAAM,sBAAsB;AAI5B,IAAM,yBAAyB,KAAK,KAAK;AAAA;AA+BzC,MAAM,qBAAqB,MAAM;AAAA,EAC7B;AAAA,EAST,WAAW,CAAC,SAAiB,MAA4B;AAAA,IACvD,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AA8BO,SAAS,kBAAkB,CAAC,SAAkD;AAAA,EACnF,MAAM,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI;AAAA,EACnD,MAAM,QAAQ,QAAQ,SAAS;AAAA,EAC/B,MAAM,cAAc,QAAQ,eAAe,oBAAoB;AAAA,EAC/D,MAAM,QAAQ,YAAY,mBAAmB;AAAA,EAE7C,OAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,QAAQ;AAAA,IACtB,iBAAiB,QAAQ,SAAS;AAAA,IAClC;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,WAAW,MAAM;AAAA,IACjB;AAAA,EACF;AAAA;AASK,SAAS,mCAAmC,CAAC,MAKE;AAAA,EACpD,MAAM,WAAW,uBAAuB;AAAA,EACxC,MAAM,QAAQ,mBAAmB;AAAA,IAC/B;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,eAAe,KAAK;AAAA,IACpB,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,CAAC;AAAA,EACD,OAAO,EAAE,UAAU,MAAM;AAAA;AAOpB,SAAS,qBAAqB,CAAC,OAAqB,KAA6B;AAAA,EACtF,MAAM,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI;AAAA,EACjC,OAAO,KAAK,MAAM;AAAA;AAab,SAAS,iBAAiB,CAC/B,OACA,SACA,UAAkC,CAAC,GAC7B;AAAA,EACN,IAAI,sBAAsB,OAAO,QAAQ,GAAG,GAAG;AAAA,IAC7C,MAAM,IAAI,aACR,sBAAsB,MAAM,2BAA2B,IAAI,KAAK,MAAM,SAAS,EAAE,YAAY,MAC7F,SACF;AAAA,EACF;AAAA,EACA,QAAQ,WAAW,IAAI,MAAM,cAAc,MAAM,eAAe;AAAA,EAChE,QAAQ,aAAa,IAAI,MAAM,eAAe,MAAM,WAAW;AAAA;AAqB1D,SAAS,qBAAqB,CAAC,OAAiC;AAAA,EACrE,yBAAyB,KAAK;AAAA,EAC9B,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,MAAM,YAAY;AAAA,EAC/D,MAAM,aAAa,IAAI,YAAY,EAAE,OAAO,MAAM,aAAa;AAAA,EAE/D,MAAM,QACJ,oBAAoB,SACpB,IACA,IACA,YAAY,SACZ,mBACA,YACA,IACA,WAAW,SACX,IACA;AAAA,EAEF,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,IAAI,SAAS;AAAA,EAEb,IAAI,IAAI,qBAAqB,MAAM;AAAA,EACnC,UAAU,oBAAoB;AAAA,EAE9B,IAAI,UAAU,MAAM;AAAA,EACpB,UAAU;AAAA,EAEV,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAC3B,UAAU,YAAY;AAAA,EAEtB,IAAI,IAAI,MAAM,iBAAiB,MAAM;AAAA,EACrC,UAAU;AAAA,EAEV,IAAI,IAAI,MAAM,aAAa,MAAM;AAAA,EACjC,UAAU;AAAA,EAEV,KAAK,UAAU,QAAQ,WAAW,QAAQ,KAAK;AAAA,EAC/C,UAAU;AAAA,EACV,IAAI,IAAI,YAAY,MAAM;AAAA,EAC1B,UAAU,WAAW;AAAA,EAKrB,KAAK,aAAa,QAAQ,OAAO,MAAM,SAAS,GAAG,KAAK;AAAA,EACxD,UAAU;AAAA,EAEV,IAAI,IAAI,MAAM,OAAO,MAAM;AAAA,EAC3B,UAAU;AAAA,EAEV,OAAO;AAAA;AAOF,SAAS,iBAAiB,CAAC,OAAiC;AAAA,EACjE,IAAI,SAAS;AAAA,EAGb,IAAI,MAAM,SAAS,oBAAoB,QAAQ;AAAA,IAC7C,MAAM,IAAI,aAAa,4BAA4B,MAAM,iBAAiB,WAAW;AAAA,EACvF;AAAA,EACA,SAAS,IAAI,EAAG,IAAI,oBAAoB,QAAQ,KAAK;AAAA,IACnD,IAAI,MAAM,SAAS,OAAO,oBAAoB,IAAI;AAAA,MAChD,MAAM,IAAI,aACR,4DACA,aACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU,oBAAoB;AAAA,EAG9B,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,uCAAuC,WAAW;AAAA,EAC3E;AAAA,EACA,MAAM,UAAU,MAAM;AAAA,EACtB,UAAU;AAAA,EACV,IAAI,YAAY,uBAAuB;AAAA,IACrC,MAAM,IAAI,aACR,kCAAkC,8CAA8C,0BAChF,iBACF;AAAA,EACF;AAAA,EAGA,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,gDAAgD,WAAW;AAAA,EACpF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,aAAa,yCAAyC,WAAW;AAAA,EAC7E;AAAA,EACA,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EACxF,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,kBAA0B;AAAA,IACpD,MAAM,IAAI,aAAa,0CAA0C,WAAW;AAAA,EAC9E;AAAA,EACA,MAAM,kBAAkB,MAAM,MAAM,QAAQ,SAAS,gBAAwB;AAAA,EAC7E,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,WAAsB;AAAA,IAChD,MAAM,IAAI,aAAa,4CAA4C,WAAW;AAAA,EAChF;AAAA,EACA,MAAM,cAAc,MAAM,MAAM,QAAQ,SAAS,SAAoB;AAAA,EACrE,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,sDAAsD,WAAW;AAAA,EAC1F;AAAA,EACA,MAAM,WAAW,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC7C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,UAAU;AAAA,IACpC,MAAM,IAAI,aAAa,+CAA+C,WAAW;AAAA,EACnF;AAAA,EACA,MAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,QAAQ,CAAC;AAAA,EACxF,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,sCAAsC,WAAW;AAAA,EAC1E;AAAA,EACA,MAAM,eAAe,KAAK,aAAa,QAAQ,KAAK;AAAA,EACpD,UAAU;AAAA,EACV,MAAM,YAAY,OAAO,YAAY;AAAA,EAGrC,IAAI,MAAM,SAAS,SAAS,qBAAqB;AAAA,IAC/C,MAAM,IAAI,aAAa,qCAAqC,WAAW;AAAA,EACzE;AAAA,EACA,MAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,mBAAmB;AAAA,EAC9D,UAAU;AAAA,EAEV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAQK,SAAS,kBAAkB,CAAC,OAA6B;AAAA,EAC9D,MAAM,QAAQ,sBAAsB,KAAK;AAAA,EAIzC,IAAI,SAAS;AAAA,EACb,WAAW,QAAQ,OAAO;AAAA,IACxB,UAAU,OAAO,aAAa,IAAI;AAAA,EACpC;AAAA,EACA,OAAO,KAAK,MAAM;AAAA;AAOb,SAAS,kBAAkB,CAAC,SAA+B;AAAA,EAChE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,KAAK,OAAO;AAAA,IACrB,MAAM;AAAA,IACN,MAAM,IAAI,aAAa,sCAAsC,aAAa;AAAA;AAAA,EAE5E,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAAA,EAC1C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,IACtC,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,EAChC;AAAA,EACA,OAAO,kBAAkB,KAAK;AAAA;AAKhC,SAAS,wBAAwB,CAAC,OAA2B;AAAA,EAC3D,IAAI,MAAM,gBAAgB,WAAW,kBAA0B;AAAA,IAC7D,MAAM,IAAI,aACR,6BAA6B,+BAAuC,MAAM,gBAAgB,WAC1F,oBACF;AAAA,EACF;AAAA,EACA,IAAI,MAAM,YAAY,WAAW,WAAsB;AAAA,IACrD,MAAM,IAAI,aACR,wBAAwB,wBAAmC,MAAM,YAAY,WAC7E,sBACF;AAAA,EACF;AAAA,EACA,IAAI,MAAM,MAAM,WAAW,qBAAqB;AAAA,IAC9C,MAAM,IAAI,aACR,iBAAiB,kCAAkC,MAAM,MAAM,WAC/D,eACF;AAAA,EACF;AAAA;AAGF,SAAS,WAAW,CAAC,GAAuB;AAAA,EAC1C,MAAM,MAAM,IAAI,WAAW,CAAC;AAAA,EAC5B,OAAO,gBAAgB,GAAG;AAAA,EAC1B,OAAO;AAAA;;ACpYF,IAAM,4BAA4B;AAGlC,IAAM,mBAAmB,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC;AAAA;AAwBhE,MAAM,wBAAwB,MAAM;AAAA,EAChC;AAAA,EAST,WAAW,CAAC,SAAiB,MAA+B;AAAA,IAC1D,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAsBO,SAAS,gBAAgB,CAAC,SAAoD;AAAA,EACnF,MAAM,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI;AAAA,EACnD,OAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,QAAQ;AAAA,IACtB,eAAe,QAAQ;AAAA,IACvB,UAAU;AAAA,OACN,QAAQ,WAAW,YAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,EACnE;AAAA;AASK,SAAS,eAAe,CAAC,QAA0B,SAA4B;AAAA,EACpF,QAAQ,aAAa,IAAI,OAAO,aAAa;AAAA;AAUxC,SAAS,iBAAiB,CAAC,QAAgB,SAA4B;AAAA,EAC5E,QAAQ,aAAa,IAAI,MAAM;AAAA;AAmB1B,SAAS,0BAA0B,CAAC,QAAsC;AAAA,EAC/E,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,OAAO,YAAY;AAAA,EAChE,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,OAAO,aAAa;AAAA,EAClE,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,OAAO,UAAU,EAAE;AAAA,EAEhE,MAAM,QACJ,iBAAiB,SACjB,IACA,IACA,YAAY,SACZ,IACA,aAAa,SACb,IACA,IACA,YAAY;AAAA,EAEd,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,IAAI,SAAS;AAAA,EAEb,IAAI,IAAI,kBAAkB,MAAM;AAAA,EAChC,UAAU,iBAAiB;AAAA,EAE3B,IAAI,UAAU,OAAO;AAAA,EACrB,UAAU;AAAA,EAEV,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAC3B,UAAU,YAAY;AAAA,EAEtB,KAAK,UAAU,QAAQ,aAAa,QAAQ,KAAK;AAAA,EACjD,UAAU;AAAA,EACV,IAAI,IAAI,cAAc,MAAM;AAAA,EAC5B,UAAU,aAAa;AAAA,EAEvB,KAAK,aAAa,QAAQ,OAAO,OAAO,QAAQ,GAAG,KAAK;AAAA,EACxD,UAAU;AAAA,EAEV,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAE3B,OAAO;AAAA;AAIT,SAAS,sBAAsB,CAAC,OAAqC;AAAA,EACnE,IAAI,SAAS;AAAA,EAEb,IAAI,MAAM,SAAS,iBAAiB,QAAQ;AAAA,IAC1C,MAAM,IAAI,gBAAgB,0CAA0C,WAAW;AAAA,EACjF;AAAA,EACA,SAAS,IAAI,EAAG,IAAI,iBAAiB,QAAQ,KAAK;AAAA,IAChD,IAAI,MAAM,SAAS,OAAO,iBAAiB,IAAI;AAAA,MAC7C,MAAM,IAAI,gBAAgB,qCAAqC,aAAa;AAAA,IAC9E;AAAA,EACF;AAAA,EACA,UAAU,iBAAiB;AAAA,EAE3B,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,2CAA2C,WAAW;AAAA,EAClF;AAAA,EACA,MAAM,UAAU,MAAM;AAAA,EACtB,UAAU;AAAA,EACV,IAAI,YAAY,2BAA2B;AAAA,IACzC,MAAM,IAAI,gBAAgB,sCAAsC,YAAY,iBAAiB;AAAA,EAC/F;AAAA,EAEA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAE1E,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,iDAAiD,WAAW;AAAA,EACxF;AAAA,EACA,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,gBAAgB,6CAA6C,WAAW;AAAA,EACpF;AAAA,EACA,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EACxF,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,qDAAqD,WAAW;AAAA,EAC5F;AAAA,EACA,MAAM,aAAa,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC/C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,YAAY;AAAA,IACtC,MAAM,IAAI,gBAAgB,8CAA8C,WAAW;AAAA,EACrF;AAAA,EACA,MAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,UAAU,CAAC;AAAA,EAC1F,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,4CAA4C,WAAW;AAAA,EACnF;AAAA,EACA,MAAM,WAAW,OAAO,KAAK,aAAa,QAAQ,KAAK,CAAC;AAAA,EACxD,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,iDAAiD,WAAW;AAAA,EACxF;AAAA,EACA,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,gBAAgB,0CAA0C,WAAW;AAAA,EACjF;AAAA,EACA,MAAM,SAAS,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EAClF,UAAU;AAAA,EAEV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,OACI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AAAA;AAQK,SAAS,gBAAgB,CAAC,QAA0B,QAAoC;AAAA,EAC7F,MAAM,UAAU,2BAA2B,MAAM;AAAA,EACjD,MAAM,WAAW,aAAa,SAAS,OAAO,cAAc,OAAO,SAAS;AAAA,EAC5E,OAAO,qBAAqB,QAAQ;AAAA;AAmB/B,SAAS,gBAAgB,CAAC,OAAmB,SAAwC;AAAA,EAC1F,MAAM,WAAW,qBAAqB,KAAK;AAAA,EAC3C,MAAM,YAAY,QAAQ,WAAW,IAAI,SAAS,QAAQ;AAAA,EAC1D,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,gBACR,qBAAqB,SAAS,yCAC9B,gBACF;AAAA,EACF;AAAA,EACA,IACE,QAAQ,wBAAwB,aAChC,QAAQ,oBAAoB,OAAO,KACnC,CAAC,QAAQ,oBAAoB,IAAI,SAAS,QAAQ,GAClD;AAAA,IACA,MAAM,IAAI,gBACR,qBAAqB,SAAS,8DAC9B,qBACF;AAAA,EACF;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,eAAe,cAAmB,UAAU,SAAS;AAAA,IACrD,MAAM;AAAA,IACN,MAAM,IAAI,gBACR,uDAAuD,SAAS,aAChE,mBACF;AAAA;AAAA,EAGF,MAAM,SAAS,uBAAuB,YAAY;AAAA,EAGlD,IAAI,OAAO,iBAAiB,SAAS,UAAU;AAAA,IAC7C,MAAM,IAAI,gBACR,oCAAoC,OAAO,+CAA+C,SAAS,aACnG,sBACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;",
|
|
28
|
-
"debugId": "
|
|
28
|
+
"mappings": "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",
|
|
29
|
+
"debugId": "0A403673455F136164756E2164756E21",
|
|
29
30
|
"names": []
|
|
30
31
|
}
|
|
@@ -177,6 +177,14 @@ export declare class MeshWebRTCAdapter extends NetworkAdapter {
|
|
|
177
177
|
* queued until the data channel is open.
|
|
178
178
|
*/
|
|
179
179
|
send(message: Message): void;
|
|
180
|
+
/** Send raw wire bytes, fragmenting if they exceed the SCTP maxMessageSize
|
|
181
|
+
* cap. The default RTCDataChannel limit is 256 KiB in current Chrome and
|
|
182
|
+
* werift; oversized sends either throw, drop silently, or stall the
|
|
183
|
+
* channel, none of which surface as an error to the caller. Fragments
|
|
184
|
+
* use the same length-prefixed JSON header wire format as ordinary
|
|
185
|
+
* messages but carry a `sync-fragment` type that the receive path
|
|
186
|
+
* detects and reassembles before deserialising. */
|
|
187
|
+
private sendBytesMaybeFragmented;
|
|
180
188
|
/**
|
|
181
189
|
* Entry point the signalling client calls when it receives a signal
|
|
182
190
|
* from a remote peer. Dispatches on the payload `kind` to either
|
|
@@ -191,9 +199,15 @@ export declare class MeshWebRTCAdapter extends NetworkAdapter {
|
|
|
191
199
|
private handleOffer;
|
|
192
200
|
private handleAnswer;
|
|
193
201
|
private handleIceCandidate;
|
|
202
|
+
/** Drain the per-slot queue of remote ICE candidates that arrived
|
|
203
|
+
* before `setRemoteDescription` completed. Errors per candidate are
|
|
204
|
+
* swallowed for the same reason {@link handleIceCandidate} swallows
|
|
205
|
+
* them — a single bad candidate must not stall the connection. */
|
|
206
|
+
private flushPendingRemoteIce;
|
|
194
207
|
private wireConnection;
|
|
195
208
|
private wireDataChannel;
|
|
196
209
|
private dispatchMessage;
|
|
210
|
+
private handleSyncFragment;
|
|
197
211
|
/** Peer IDs with an open data channel, suitable for blob requests. */
|
|
198
212
|
get connectedPeerIds(): string[];
|
|
199
213
|
/** Send a pre-serialised blob message to a specific peer. Returns false
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sync-fragment — chunking, reassembly, and wire format for oversized
|
|
3
|
+
* Automerge sync messages sent through MeshWebRTCAdapter.
|
|
4
|
+
*
|
|
5
|
+
* An `RTCDataChannel.send(bytes)` call with a payload above the SCTP
|
|
6
|
+
* `maxMessageSize` limit (256 KiB by default in Chrome and werift) either
|
|
7
|
+
* throws synchronously, drops silently, or stalls the channel — none of
|
|
8
|
+
* which are observable to the caller. A first-connection Automerge sync
|
|
9
|
+
* for a doc whose state exceeds ~200 KiB produces exactly such a message,
|
|
10
|
+
* so without fragmentation the receiver's `dc.onmessage` never fires for
|
|
11
|
+
* the large payload and sync stalls forever.
|
|
12
|
+
*
|
|
13
|
+
* The wire format here mirrors the blob-transfer layout — a 4-byte
|
|
14
|
+
* big-endian header length followed by a JSON header and the chunk
|
|
15
|
+
* payload — but uses a distinct `type` value (`sync-fragment`, no
|
|
16
|
+
* `blob-` prefix) so the existing blob fast-path in MeshWebRTCAdapter
|
|
17
|
+
* does not mistake a sync fragment for a blob chunk.
|
|
18
|
+
*/
|
|
19
|
+
/** Maximum bytes a single channel.send may carry without fragmentation.
|
|
20
|
+
* Chosen well below the 256 KiB SCTP cap so the framing header for a
|
|
21
|
+
* single chunk cannot push the wire frame over the limit. Matches the
|
|
22
|
+
* blob-transfer chunk size so the two transports have a consistent
|
|
23
|
+
* per-message footprint on the data channel. */
|
|
24
|
+
export declare const SYNC_FRAGMENT_THRESHOLD: number;
|
|
25
|
+
/** Chunk size used when a message exceeds the threshold. */
|
|
26
|
+
export declare const SYNC_FRAGMENT_CHUNK_SIZE: number;
|
|
27
|
+
export interface SyncFragmentHeader {
|
|
28
|
+
type: "sync-fragment";
|
|
29
|
+
/** Identifier shared by every fragment of one original message. */
|
|
30
|
+
id: string;
|
|
31
|
+
/** Zero-based fragment index within the message. */
|
|
32
|
+
index: number;
|
|
33
|
+
/** Total number of fragments composing the message. */
|
|
34
|
+
total: number;
|
|
35
|
+
}
|
|
36
|
+
/** Wire frame for a sync fragment: 4-byte BE header length, JSON header,
|
|
37
|
+
* raw chunk bytes. Returned as an ArrayBuffer-backed Uint8Array so it is
|
|
38
|
+
* directly usable by RTCDataChannel.send under strict buffer-source typing. */
|
|
39
|
+
export declare function serialiseSyncFragment(header: SyncFragmentHeader, data: Uint8Array): Uint8Array<ArrayBuffer>;
|
|
40
|
+
/** Parse a wire frame produced by {@link serialiseSyncFragment}. Returns
|
|
41
|
+
* undefined if the bytes are too short, the header is unparseable, or the
|
|
42
|
+
* header `type` is not `sync-fragment`. */
|
|
43
|
+
export declare function parseSyncFragment(bytes: Uint8Array): {
|
|
44
|
+
header: SyncFragmentHeader;
|
|
45
|
+
data: Uint8Array;
|
|
46
|
+
} | undefined;
|
|
47
|
+
/** Cheap probe used on the receive path before parsing — looks for the
|
|
48
|
+
* literal `"type":"sync-fragment"` byte sequence inside the JSON header
|
|
49
|
+
* without a full parse. Mirrors `isBlobMessageType`. */
|
|
50
|
+
export declare function isSyncFragmentType(bytes: Uint8Array): boolean;
|
|
51
|
+
/** Split a serialised sync message into ordered fragments suitable for
|
|
52
|
+
* transmission through one data channel. The caller is responsible for
|
|
53
|
+
* generating the shared `id`. Always returns at least one fragment, so
|
|
54
|
+
* callers can use it unconditionally without a separate small-message
|
|
55
|
+
* branch — though MeshWebRTCAdapter shortcuts the small-message case to
|
|
56
|
+
* avoid the per-chunk header overhead. */
|
|
57
|
+
export declare function chunkSyncMessage(bytes: Uint8Array, id: string, chunkSize?: number): Uint8Array<ArrayBuffer>[];
|
|
58
|
+
/** Reassemble a complete fragment map into the original byte sequence.
|
|
59
|
+
* Throws if any index in [0, total) is missing. */
|
|
60
|
+
export declare function reassembleSyncFragments(chunks: Map<number, Uint8Array>, total: number): Uint8Array;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fairfox/polly",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.52.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Multi-execution-context framework with reactive state and cross-context messaging for Chrome extensions, PWAs, and worker-based applications",
|