@superbee/core 0.2.0-pre.6 → 0.2.0-pre.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -0
- package/dist/bundle-ops.d.ts +1 -1
- package/dist/bundle-ops.d.ts.map +1 -1
- package/dist/bundle-ops.js +2 -2
- package/dist/bundle-ops.js.map +1 -1
- package/dist/engine.d.ts +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +4 -3
- package/dist/engine.js.map +1 -1
- package/dist/file-journaled-backend-internal.d.ts +19 -0
- package/dist/file-journaled-backend-internal.d.ts.map +1 -0
- package/dist/file-journaled-backend-internal.js +10 -0
- package/dist/file-journaled-backend-internal.js.map +1 -0
- package/dist/file-journaled-backend.d.ts +162 -0
- package/dist/file-journaled-backend.d.ts.map +1 -0
- package/dist/file-journaled-backend.js +1113 -0
- package/dist/file-journaled-backend.js.map +1 -0
- package/dist/filesystem-lock.d.ts +10 -0
- package/dist/filesystem-lock.d.ts.map +1 -1
- package/dist/filesystem-lock.js +133 -8
- package/dist/filesystem-lock.js.map +1 -1
- package/dist/filesystem-push-role.d.ts +77 -0
- package/dist/filesystem-push-role.d.ts.map +1 -0
- package/dist/filesystem-push-role.js +165 -0
- package/dist/filesystem-push-role.js.map +1 -0
- package/dist/governed-body-write.d.ts +8 -1
- package/dist/governed-body-write.d.ts.map +1 -1
- package/dist/governed-body-write.js +9 -2
- package/dist/governed-body-write.js.map +1 -1
- package/dist/host-text.d.ts +31 -0
- package/dist/host-text.d.ts.map +1 -0
- package/dist/host-text.js +77 -0
- package/dist/host-text.js.map +1 -0
- package/dist/hosted-transport/answer-rows.d.ts +216 -0
- package/dist/hosted-transport/answer-rows.d.ts.map +1 -0
- package/dist/hosted-transport/answer-rows.js +396 -0
- package/dist/hosted-transport/answer-rows.js.map +1 -0
- package/dist/hosted-transport/carrier.d.ts +142 -0
- package/dist/hosted-transport/carrier.d.ts.map +1 -0
- package/dist/hosted-transport/carrier.js +241 -0
- package/dist/hosted-transport/carrier.js.map +1 -0
- package/dist/hosted-transport/history-pages.d.ts +55 -0
- package/dist/hosted-transport/history-pages.d.ts.map +1 -0
- package/dist/hosted-transport/history-pages.js +69 -0
- package/dist/hosted-transport/history-pages.js.map +1 -0
- package/dist/hosted-transport/index.d.ts +18 -0
- package/dist/hosted-transport/index.d.ts.map +1 -0
- package/dist/hosted-transport/index.js +18 -0
- package/dist/hosted-transport/index.js.map +1 -0
- package/dist/hosted-transport/operations.d.ts +85 -0
- package/dist/hosted-transport/operations.d.ts.map +1 -0
- package/dist/hosted-transport/operations.js +128 -0
- package/dist/hosted-transport/operations.js.map +1 -0
- package/dist/hosted-transport/paged-reads.d.ts +87 -0
- package/dist/hosted-transport/paged-reads.d.ts.map +1 -0
- package/dist/hosted-transport/paged-reads.js +238 -0
- package/dist/hosted-transport/paged-reads.js.map +1 -0
- package/dist/hosted-transport/read-adapter.d.ts +250 -0
- package/dist/hosted-transport/read-adapter.d.ts.map +1 -0
- package/dist/hosted-transport/read-adapter.js +557 -0
- package/dist/hosted-transport/read-adapter.js.map +1 -0
- package/dist/hosted-transport/root-write.d.ts +114 -0
- package/dist/hosted-transport/root-write.d.ts.map +1 -0
- package/dist/hosted-transport/root-write.js +171 -0
- package/dist/hosted-transport/root-write.js.map +1 -0
- package/dist/hosted-transport/whole-document-transport.d.ts +174 -0
- package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -0
- package/dist/hosted-transport/whole-document-transport.js +411 -0
- package/dist/hosted-transport/whole-document-transport.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/indexeddb-backend.d.ts +6 -1
- package/dist/indexeddb-backend.d.ts.map +1 -1
- package/dist/indexeddb-backend.js +77 -6
- package/dist/indexeddb-backend.js.map +1 -1
- package/dist/journaled-backend.d.ts +73 -5
- package/dist/journaled-backend.d.ts.map +1 -1
- package/dist/journaled-backend.js +55 -1
- package/dist/journaled-backend.js.map +1 -1
- package/dist/kinds.d.ts +25 -1
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +52 -4
- package/dist/kinds.js.map +1 -1
- package/dist/links.d.ts +1 -1
- package/dist/links.d.ts.map +1 -1
- package/dist/links.js +5 -10
- package/dist/links.js.map +1 -1
- package/dist/platform.d.ts +9 -2
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js.map +1 -1
- package/dist/query-order.d.ts +22 -0
- package/dist/query-order.d.ts.map +1 -0
- package/dist/query-order.js +42 -0
- package/dist/query-order.js.map +1 -0
- package/dist/remote-backend.d.ts +56 -11
- package/dist/remote-backend.d.ts.map +1 -1
- package/dist/remote-backend.js +154 -27
- package/dist/remote-backend.js.map +1 -1
- package/dist/remote-error.d.ts +17 -1
- package/dist/remote-error.d.ts.map +1 -1
- package/dist/remote-error.js +32 -2
- package/dist/remote-error.js.map +1 -1
- package/dist/remote-operations.d.ts +5 -4
- package/dist/remote-operations.d.ts.map +1 -1
- package/dist/remote-operations.js +16 -6
- package/dist/remote-operations.js.map +1 -1
- package/dist/remote-parsers.d.ts +1 -1
- package/dist/remote-parsers.js +1 -1
- package/dist/types.d.ts +9 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/uncertain-write.d.ts +45 -11
- package/dist/uncertain-write.d.ts.map +1 -1
- package/dist/uncertain-write.js +30 -9
- package/dist/uncertain-write.js.map +1 -1
- package/package.json +17 -1
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The working copy's read side over a hosted bundle: a `StorageBackend` that also carries
|
|
3
|
+
* `heads`, `snapshot` and `wireCapabilities`, so the shared bootstrap and pull verbs take their
|
|
4
|
+
* wire path against it. It answers only what those verbs call and refuses the rest before any
|
|
5
|
+
* request leaves; every mutation is refused, because edits leave through the write transport.
|
|
6
|
+
*
|
|
7
|
+
* Refusals follow {@link READ_ANSWER_ROWS}: an authority refusal is a `RemoteError` with the
|
|
8
|
+
* host's status and code, which the shared runtime classifies; a `503` says nothing about the
|
|
9
|
+
* bundle, so it is the carrier's `unavailable` and the runtime reports itself offline. A read
|
|
10
|
+
* the host answers `document_not_found` is an ENOENT-shaped rejection, as every backend answers
|
|
11
|
+
* absence.
|
|
12
|
+
*
|
|
13
|
+
* The capabilities answer (flags, bound, root, retention window) is read once and held. Every
|
|
14
|
+
* heads answer states the root's version; one that differs from the held answer's root drops
|
|
15
|
+
* it, so the root and the edition it declares are as new as the listing. Any authority refusal
|
|
16
|
+
* drops it too.
|
|
17
|
+
*
|
|
18
|
+
* The host serves heads and snapshot a page at a time; a bundle that fits in one page gets one
|
|
19
|
+
* answer, as before paging. The adapter follows the `next` cursor (`paged-reads.ts`) and hands
|
|
20
|
+
* the verbs the same whole listing and the same one snapshot body.
|
|
21
|
+
*/
|
|
22
|
+
import { malformed, onRoute, RemoteError } from "../remote-error.js";
|
|
23
|
+
import { parseHeadsAnswer, readSnapshotStream } from "../remote-parsers.js";
|
|
24
|
+
import { isContentVersion } from "../version-transport.js";
|
|
25
|
+
import { sha256HexOfUtf8 } from "../sha256.js";
|
|
26
|
+
import { stripHostText } from "../host-text.js";
|
|
27
|
+
import { HostedCarrierError } from "./carrier.js";
|
|
28
|
+
import { decodeHeadsPage, HEADS_PAGE_ATTEMPTS, HeadsPages, isPageRestart, pageRestartDelay, pause, stitchSnapshotPages } from "./paged-reads.js";
|
|
29
|
+
/** The retention window assumed for a host that states none: thirty days. */
|
|
30
|
+
export const DEFAULT_OPERATIONS_RETENTION_MS = 30 * 24 * 60 * 60 * 1000;
|
|
31
|
+
/**
|
|
32
|
+
* How long before the window ends an absent outcome stops being trusted: the host expires rows
|
|
33
|
+
* by its own clock and the client measures an intent's age by its own, so the last hour of the
|
|
34
|
+
* window is treated as already expired.
|
|
35
|
+
*/
|
|
36
|
+
export const OPERATIONS_RETENTION_SKEW_MS = 60 * 60 * 1000;
|
|
37
|
+
/** The header every heads answer carries: the root's content version, or {@link ROOT_VERSION_ABSENT}. */
|
|
38
|
+
export const ROOT_VERSION_HEADER = "X-Superbee-Root-Version";
|
|
39
|
+
export const ROOT_VERSION_ABSENT = "none";
|
|
40
|
+
/** The root version a heads answer states: a version, `null` for the absent marker, `undefined` when malformed. */
|
|
41
|
+
export function decodeRootVersion(value) {
|
|
42
|
+
if (value === ROOT_VERSION_ABSENT)
|
|
43
|
+
return null;
|
|
44
|
+
return isContentVersion(value) ? value : undefined;
|
|
45
|
+
}
|
|
46
|
+
export const HOSTED_READ_BOUNDS = Object.freeze({
|
|
47
|
+
/** A capabilities answer carries the root's exact bytes, bounded like one document read. */
|
|
48
|
+
capabilitiesBytes: 4 * 1024 * 1024,
|
|
49
|
+
/** A heads listing at the inventory bound is a few hundred KiB; four MiB is a safe superset. */
|
|
50
|
+
headsBytes: 4 * 1024 * 1024,
|
|
51
|
+
/** One document read's answer, and one snapshot line. */
|
|
52
|
+
documentBytes: 1024 * 1024 + 64 * 1024,
|
|
53
|
+
/** One history page's answer: the host bounds `documents.history.v1` at 1 MiB; the slack is the envelope's. */
|
|
54
|
+
historyBytes: 1024 * 1024 + 64 * 1024,
|
|
55
|
+
/** The operation listing's answer: at most 200 descriptors, each with its two JSON Schemas. */
|
|
56
|
+
operationsBytes: 256 * 1024,
|
|
57
|
+
/** Any one operation run's answer; the operation's own `maximumOutputBytes` is lower when it says so. */
|
|
58
|
+
runBytes: 4 * 1024 * 1024,
|
|
59
|
+
/** The most bytes one run's input may take, as a caller serializes it (the CLI's --input, MCP's run_operation). */
|
|
60
|
+
runInputBytes: 64 * 1024,
|
|
61
|
+
/** The most operation descriptors one listing admits; the rest are dropped with a note. */
|
|
62
|
+
operations: 200,
|
|
63
|
+
/** The deepest nesting (objects and arrays, the schema itself level 1) a descriptor's schema may have. */
|
|
64
|
+
operationSchemaDepth: 32,
|
|
65
|
+
/** An operation title's and description's length, in UTF-16 units, once stripped. */
|
|
66
|
+
operationTitleChars: 200,
|
|
67
|
+
operationDescriptionChars: 2048,
|
|
68
|
+
/** The deepest nesting (objects and arrays, the data itself level 1) a run's data may have. */
|
|
69
|
+
runDepth: 256,
|
|
70
|
+
/** Document reads in flight at once, whatever concurrency a caller's batches ask for. */
|
|
71
|
+
readConcurrency: 8,
|
|
72
|
+
});
|
|
73
|
+
export const BROWSER_READ_ROUTES = Object.freeze({
|
|
74
|
+
capabilities: "/reader/capabilities",
|
|
75
|
+
heads: "/reader/heads",
|
|
76
|
+
snapshot: "/reader/snapshot",
|
|
77
|
+
read: "/reader/read",
|
|
78
|
+
});
|
|
79
|
+
export const SYNC_READ_ROUTES = Object.freeze({
|
|
80
|
+
capabilities: "/sync/v1/capabilities",
|
|
81
|
+
heads: "/sync/v1/heads",
|
|
82
|
+
snapshot: "/sync/v1/snapshot",
|
|
83
|
+
read: "/sync/v1/read",
|
|
84
|
+
});
|
|
85
|
+
export class HostedReadAdapterError extends Error {
|
|
86
|
+
name = "HostedReadAdapterError";
|
|
87
|
+
code;
|
|
88
|
+
constructor(code) {
|
|
89
|
+
super(code);
|
|
90
|
+
this.code = code;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function notFound(id) {
|
|
94
|
+
const error = new Error(`no concept document '${id}'`);
|
|
95
|
+
error.code = "ENOENT";
|
|
96
|
+
return error;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The grammar of a refusal code a host may name (`bundle_not_found`, `unknown_operation`, ...).
|
|
100
|
+
* A code is host text that reaches messages and details; anything outside it is never echoed.
|
|
101
|
+
*/
|
|
102
|
+
export const REFUSAL_CODE = /^[a-z][a-z0-9_]{0,63}$/;
|
|
103
|
+
function errorCode(body) {
|
|
104
|
+
const error = body?.error;
|
|
105
|
+
return typeof error?.code === "string" && REFUSAL_CODE.test(error.code) ? error.code : undefined;
|
|
106
|
+
}
|
|
107
|
+
/** A read route's refusal as the runtime must see it (the `refusal` rows of {@link READ_ANSWER_ROWS}). */
|
|
108
|
+
export function readRefusal(answer) {
|
|
109
|
+
const { status } = answer;
|
|
110
|
+
if (status === 503)
|
|
111
|
+
return new HostedCarrierError("unavailable");
|
|
112
|
+
const code = errorCode(answer.body) ?? (status === 401 || status === 403 ? "AUTH_REQUIRED" : status >= 500 ? "RUNTIME" : "USAGE");
|
|
113
|
+
return new RemoteError(`hosted read route answered ${status} ${code}`, code, status);
|
|
114
|
+
}
|
|
115
|
+
/** A carrier failure before a read left is the authority's `401`; anything else stays the carrier's. */
|
|
116
|
+
function carrierFailure(error) {
|
|
117
|
+
if (error instanceof HostedCarrierError && error.code === "denied")
|
|
118
|
+
throw new RemoteError("no credential for the host", "AUTH_REQUIRED", 401, error);
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
function positiveInteger(value) {
|
|
122
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The whole-document write bound a host states in its `limits`, or `null` when it states none.
|
|
126
|
+
* A malformed statement reads as none (the 65,536 every older host accepts), never as a refusal:
|
|
127
|
+
* the bound only narrows what a client sends.
|
|
128
|
+
*/
|
|
129
|
+
export function statedDocumentInputBytes(limits) {
|
|
130
|
+
if (typeof limits !== "object" || limits === null || Array.isArray(limits))
|
|
131
|
+
return null;
|
|
132
|
+
const stated = limits.documentInputBytes;
|
|
133
|
+
return positiveInteger(stated) ? stated : null;
|
|
134
|
+
}
|
|
135
|
+
/** The capabilities route's answer, admitted or refused as one; fields the route may gain are ignored. */
|
|
136
|
+
export function decodeHostedCapabilities(value) {
|
|
137
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
138
|
+
throw malformed("capabilities answer is not a JSON object");
|
|
139
|
+
const body = value;
|
|
140
|
+
const flag = (key) => {
|
|
141
|
+
if (typeof body[key] !== "boolean")
|
|
142
|
+
throw malformed(`capabilities answer lacks a boolean ${key}`);
|
|
143
|
+
return body[key];
|
|
144
|
+
};
|
|
145
|
+
const bound = body.bound;
|
|
146
|
+
if (typeof bound !== "object" || bound === null || !positiveInteger(bound.documents) || !positiveInteger(bound.bytes))
|
|
147
|
+
throw malformed("capabilities answer lacks the working copy bound");
|
|
148
|
+
let root = null;
|
|
149
|
+
if (body.root !== null) {
|
|
150
|
+
const raw = body.root;
|
|
151
|
+
if (typeof raw !== "object" || raw === null || typeof raw.content !== "string" || !isContentVersion(raw.version))
|
|
152
|
+
throw malformed("capabilities answer carries a malformed root");
|
|
153
|
+
root = Object.freeze({ content: raw.content, version: raw.version });
|
|
154
|
+
}
|
|
155
|
+
let paged = null;
|
|
156
|
+
if (body.paged !== undefined) {
|
|
157
|
+
const raw = body.paged;
|
|
158
|
+
if (typeof raw !== "object" || raw === null || !positiveInteger(raw.documents) || raw.documents < bound.documents)
|
|
159
|
+
throw malformed("capabilities answer carries a malformed paged bound");
|
|
160
|
+
paged = Object.freeze({ documents: raw.documents });
|
|
161
|
+
}
|
|
162
|
+
const retention = body.operationsRetentionMs;
|
|
163
|
+
// A window inside the skew margin leaves no interval in which absence is evidence.
|
|
164
|
+
if (retention !== undefined && (!positiveInteger(retention) || retention <= OPERATIONS_RETENTION_SKEW_MS))
|
|
165
|
+
throw malformed("capabilities answer carries a malformed retention window");
|
|
166
|
+
return Object.freeze({
|
|
167
|
+
heads: flag("heads"),
|
|
168
|
+
snapshot: flag("snapshot"),
|
|
169
|
+
operations: flag("operations"),
|
|
170
|
+
bound: Object.freeze({ documents: bound.documents, bytes: bound.bytes }),
|
|
171
|
+
paged,
|
|
172
|
+
root,
|
|
173
|
+
operationsRetentionMs: retention ?? DEFAULT_OPERATIONS_RETENTION_MS,
|
|
174
|
+
definitionWrites: body.definitionWrites === undefined ? null : body.definitionWrites === "allowed" ? "allowed" : "refused",
|
|
175
|
+
rootWrites: body.rootWrites === "allowed" ? "allowed" : "refused",
|
|
176
|
+
documentInputBytes: statedDocumentInputBytes(body.limits),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/** Fail a stream whose line runs past `maximum` bytes without its newline, before it is buffered whole. */
|
|
180
|
+
function boundedLines(body, maximum) {
|
|
181
|
+
let sinceNewline = 0;
|
|
182
|
+
return body.pipeThrough(new TransformStream({
|
|
183
|
+
transform(chunk, controller) {
|
|
184
|
+
let start = 0;
|
|
185
|
+
for (let index = chunk.indexOf(10); index !== -1; index = chunk.indexOf(10, start)) {
|
|
186
|
+
if (sinceNewline + index - start > maximum) {
|
|
187
|
+
controller.error(malformed(`snapshot line exceeds ${maximum} bytes`));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
sinceNewline = 0;
|
|
191
|
+
start = index + 1;
|
|
192
|
+
}
|
|
193
|
+
sinceNewline += chunk.byteLength - start;
|
|
194
|
+
if (sinceNewline > maximum) {
|
|
195
|
+
controller.error(malformed(`snapshot line exceeds ${maximum} bytes`));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
controller.enqueue(chunk);
|
|
199
|
+
},
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
const TRANSIENT_READ_CODES = new Set(["backend_unavailable", "cancelled", "deadline_exceeded", "internal_error", "synchronization_pending"]);
|
|
203
|
+
/**
|
|
204
|
+
* A `documents.read.v1` success, decoded against hosted's result schema
|
|
205
|
+
* (`{ ok: true, operationId, data: { document: { id, frontmatter, body }, version } }`, with an
|
|
206
|
+
* optional `viewActionContext` and `readSnapshot` this reader does not use): the document it names
|
|
207
|
+
* must be the one asked for, at a content version.
|
|
208
|
+
*/
|
|
209
|
+
export function decodeDocumentRead(id, body, route) {
|
|
210
|
+
const envelope = body;
|
|
211
|
+
const data = envelope?.data;
|
|
212
|
+
const document = data?.document;
|
|
213
|
+
if (envelope?.operationId !== "documents.read.v1" || envelope.ok !== true || typeof data !== "object" || data === null || !isContentVersion(data.version) ||
|
|
214
|
+
typeof document !== "object" || document === null || document.id !== id || typeof document.frontmatter !== "object" || document.frontmatter === null ||
|
|
215
|
+
Array.isArray(document.frontmatter) || typeof document.body !== "string")
|
|
216
|
+
throw malformed("document read answered an envelope that is not documents.read.v1's result for this document", route);
|
|
217
|
+
return { doc: { id, frontmatter: document.frontmatter, body: document.body }, version: data.version };
|
|
218
|
+
}
|
|
219
|
+
/** The operation a hosted history read runs (`POST <sync prefix>/history`). */
|
|
220
|
+
export const HISTORY_OPERATION_ID = "documents.history.v1";
|
|
221
|
+
/** The most versions one history page lists (hosted's `READ_LIMITS.documents`). */
|
|
222
|
+
export const HISTORY_PAGE_LIMIT = 100;
|
|
223
|
+
/** The body a history request sends. */
|
|
224
|
+
export function historyInput(bundleId, request) {
|
|
225
|
+
return {
|
|
226
|
+
bundleId,
|
|
227
|
+
documentId: request.documentId,
|
|
228
|
+
limit: request.limit,
|
|
229
|
+
...(request.before === undefined ? {} : { before: request.before }),
|
|
230
|
+
...(request.includeContent ? { includeContent: true } : {}),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
const optionalString = (value) => value === undefined || typeof value === "string";
|
|
234
|
+
const count = (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
235
|
+
/**
|
|
236
|
+
* A `documents.history.v1` success, decoded against hosted's result schema
|
|
237
|
+
* (`{ ok: true, operationId, data: { documentId, versions: [{ seq, version, actor, timestamp,
|
|
238
|
+
* agent?, content? }], more, total? } }`) and against the page asked for: the document named,
|
|
239
|
+
* at most `limit` rows, `seq` strictly descending and below `before`, content exactly when asked
|
|
240
|
+
* and hashing to its version, a `more` page that is full, and a first page's `total`. Fields the
|
|
241
|
+
* result may gain are ignored.
|
|
242
|
+
*/
|
|
243
|
+
export function decodeDocumentHistory(request, body, route) {
|
|
244
|
+
const fail = (why) => {
|
|
245
|
+
throw malformed(`history answered ${why}`, route);
|
|
246
|
+
};
|
|
247
|
+
const envelope = body;
|
|
248
|
+
if (envelope?.operationId !== HISTORY_OPERATION_ID || envelope.ok !== true)
|
|
249
|
+
fail(`an envelope that is not ${HISTORY_OPERATION_ID}'s result`);
|
|
250
|
+
const data = envelope.data;
|
|
251
|
+
if (typeof data !== "object" || data === null || Array.isArray(data))
|
|
252
|
+
fail("without its data");
|
|
253
|
+
if (data.documentId !== request.documentId)
|
|
254
|
+
fail("for another document");
|
|
255
|
+
if (!Array.isArray(data.versions) || data.versions.length > request.limit)
|
|
256
|
+
fail("more versions than asked for, or none as a list");
|
|
257
|
+
if (typeof data.more !== "boolean")
|
|
258
|
+
fail("without a boolean more");
|
|
259
|
+
const rows = data.versions;
|
|
260
|
+
const versions = [];
|
|
261
|
+
let below = request.before ?? Number.MAX_SAFE_INTEGER + 1;
|
|
262
|
+
for (const raw of rows) {
|
|
263
|
+
const row = raw;
|
|
264
|
+
if (typeof row !== "object" || row === null || Array.isArray(row))
|
|
265
|
+
fail("a version that is not an object");
|
|
266
|
+
const { seq, version, actor, timestamp, agent, content } = row;
|
|
267
|
+
if (!positiveInteger(seq) || seq >= below)
|
|
268
|
+
fail("versions out of order, or outside the page asked for");
|
|
269
|
+
below = seq;
|
|
270
|
+
if (!isContentVersion(version) || typeof actor !== "string" || actor === "" || typeof timestamp !== "string" || !optionalString(agent))
|
|
271
|
+
fail("a malformed version row");
|
|
272
|
+
if (request.includeContent) {
|
|
273
|
+
if (typeof content !== "string")
|
|
274
|
+
fail("a version without the content asked for");
|
|
275
|
+
if (`sha256:${sha256HexOfUtf8(content)}` !== version)
|
|
276
|
+
fail("content that does not match its version");
|
|
277
|
+
}
|
|
278
|
+
else if (content !== undefined) {
|
|
279
|
+
fail("content that was not asked for");
|
|
280
|
+
}
|
|
281
|
+
versions.push(Object.freeze({
|
|
282
|
+
seq: seq,
|
|
283
|
+
version: version,
|
|
284
|
+
actor: actor,
|
|
285
|
+
timestamp: timestamp,
|
|
286
|
+
...(agent === undefined ? {} : { agent: agent }),
|
|
287
|
+
...(content === undefined ? {} : { content: content }),
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
// A page that says more exists is full, so the next page always moves; a first page counts the lineage.
|
|
291
|
+
if (data.more && versions.length !== request.limit)
|
|
292
|
+
fail("more versions without a full page");
|
|
293
|
+
let total;
|
|
294
|
+
if (request.before === undefined) {
|
|
295
|
+
// A first page lists `total` rows exactly when nothing older exists, and fewer when more does.
|
|
296
|
+
if (!count(data.total) || (data.more ? data.total <= versions.length : data.total !== versions.length))
|
|
297
|
+
fail("a first page without a consistent total");
|
|
298
|
+
total = data.total;
|
|
299
|
+
}
|
|
300
|
+
return Object.freeze({ documentId: request.documentId, versions: Object.freeze(versions), more: data.more, ...(total === undefined ? {} : { total }) });
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* The refusal a 200 operation answer carries, or `undefined` for an answer that is not one
|
|
304
|
+
* (`ok` is not `false`). A refusal must name `operationId` and an error code in
|
|
305
|
+
* {@link REFUSAL_CODE}; any other `ok: false` envelope is malformed. The message is host text,
|
|
306
|
+
* stripped of control and format characters. One reading for every kernel operation a hosted
|
|
307
|
+
* client runs.
|
|
308
|
+
*/
|
|
309
|
+
export function operationRefusal(body, operationId, route) {
|
|
310
|
+
const envelope = body;
|
|
311
|
+
if (envelope?.ok !== false)
|
|
312
|
+
return undefined;
|
|
313
|
+
const error = envelope.error;
|
|
314
|
+
if (envelope.operationId !== operationId || typeof error !== "object" || error === null || typeof error.code !== "string" || !REFUSAL_CODE.test(error.code))
|
|
315
|
+
throw malformed(`answered a refusal that is not ${operationId}'s`, route);
|
|
316
|
+
return refusalOf(error.code, error.message, error.retryable);
|
|
317
|
+
}
|
|
318
|
+
/** The most UTF-16 units of a host's refusal message kept, once stripped. */
|
|
319
|
+
const REFUSAL_MESSAGE_CHARS = 500;
|
|
320
|
+
function refusalOf(code, message, retryable) {
|
|
321
|
+
const text = typeof message === "string" ? stripHostText(message, REFUSAL_MESSAGE_CHARS) : "";
|
|
322
|
+
return Object.freeze({ code, message: text === "" ? code : text, retryable: retryable === true });
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* A route family's own refusal body (`{ error: { code, message, retryable } }`, as capabilities,
|
|
326
|
+
* export and the operation listing answer it), or `undefined` when the body is not one or names a
|
|
327
|
+
* code outside {@link REFUSAL_CODE}. The message is host text, stripped.
|
|
328
|
+
*/
|
|
329
|
+
export function familyRefusal(answer) {
|
|
330
|
+
const error = answer.body?.error;
|
|
331
|
+
if (typeof error !== "object" || error === null || Array.isArray(error))
|
|
332
|
+
return undefined;
|
|
333
|
+
const { code, message, retryable } = error;
|
|
334
|
+
return typeof code === "string" && REFUSAL_CODE.test(code) ? refusalOf(code, message, retryable) : undefined;
|
|
335
|
+
}
|
|
336
|
+
/** A 200 history answer, decoded against the page asked for. */
|
|
337
|
+
export function decodeHistoryAnswer(request, body, route) {
|
|
338
|
+
const refusal = operationRefusal(body, HISTORY_OPERATION_ID, route);
|
|
339
|
+
return refusal ? { ok: false, refusal } : { ok: true, page: decodeDocumentHistory(request, body, route) };
|
|
340
|
+
}
|
|
341
|
+
/** `documents`, naming `route` on a malformed answer the iteration rejects with. */
|
|
342
|
+
async function* namingRoute(route, documents) {
|
|
343
|
+
try {
|
|
344
|
+
yield* documents;
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
await onRoute(route, () => Promise.reject(error));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
export function createHostedReadAdapter(options) {
|
|
351
|
+
const { carrier, bundleId } = options;
|
|
352
|
+
const routes = options.routes ?? BROWSER_READ_ROUTES;
|
|
353
|
+
const controller = new AbortController();
|
|
354
|
+
let held;
|
|
355
|
+
let reading;
|
|
356
|
+
let inFlight = 0;
|
|
357
|
+
const waiting = [];
|
|
358
|
+
const forget = () => {
|
|
359
|
+
held = undefined;
|
|
360
|
+
reading = undefined;
|
|
361
|
+
};
|
|
362
|
+
const assertOpen = () => {
|
|
363
|
+
if (controller.signal.aborted)
|
|
364
|
+
throw new HostedCarrierError("unavailable");
|
|
365
|
+
};
|
|
366
|
+
const refused = (answer) => {
|
|
367
|
+
const error = readRefusal(answer);
|
|
368
|
+
// A page restart says the bundle moved, nothing about the caller or the held answer.
|
|
369
|
+
if (error instanceof RemoteError && !isPageRestart(error))
|
|
370
|
+
forget();
|
|
371
|
+
throw error;
|
|
372
|
+
};
|
|
373
|
+
async function acquire() {
|
|
374
|
+
if (inFlight < HOSTED_READ_BOUNDS.readConcurrency) {
|
|
375
|
+
inFlight += 1;
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
await new Promise((resolve) => waiting.push(resolve));
|
|
379
|
+
}
|
|
380
|
+
function release() {
|
|
381
|
+
const next = waiting.shift();
|
|
382
|
+
if (next)
|
|
383
|
+
next();
|
|
384
|
+
else
|
|
385
|
+
inFlight -= 1;
|
|
386
|
+
}
|
|
387
|
+
function capabilities() {
|
|
388
|
+
if (held)
|
|
389
|
+
return Promise.resolve(held);
|
|
390
|
+
if (reading)
|
|
391
|
+
return reading;
|
|
392
|
+
assertOpen();
|
|
393
|
+
const pending = carrier
|
|
394
|
+
.json(routes.capabilities, { bundleId }, controller.signal, { maximum: HOSTED_READ_BOUNDS.capabilitiesBytes })
|
|
395
|
+
.catch(carrierFailure)
|
|
396
|
+
.then((answer) => {
|
|
397
|
+
if (answer.status !== 200)
|
|
398
|
+
refused(answer);
|
|
399
|
+
return onRoute(routes.capabilities, async () => decodeHostedCapabilities(answer.body));
|
|
400
|
+
});
|
|
401
|
+
reading = pending;
|
|
402
|
+
// A failed read is not held: the next call asks again. A read superseded by a `forget` is not held either.
|
|
403
|
+
pending.then((decoded) => {
|
|
404
|
+
if (reading === pending)
|
|
405
|
+
held = decoded;
|
|
406
|
+
}, () => {
|
|
407
|
+
if (reading === pending)
|
|
408
|
+
reading = undefined;
|
|
409
|
+
});
|
|
410
|
+
return pending;
|
|
411
|
+
}
|
|
412
|
+
async function read(id) {
|
|
413
|
+
assertOpen();
|
|
414
|
+
await acquire();
|
|
415
|
+
try {
|
|
416
|
+
assertOpen();
|
|
417
|
+
const answer = await carrier
|
|
418
|
+
.json(routes.read, { bundleId, documentId: id }, controller.signal, { maximum: HOSTED_READ_BOUNDS.documentBytes, ...(options.binding ? { binding: options.binding } : {}) })
|
|
419
|
+
.catch(carrierFailure);
|
|
420
|
+
if (answer.status !== 200)
|
|
421
|
+
refused(answer);
|
|
422
|
+
const refusal = await onRoute(routes.read, async () => operationRefusal(answer.body, "documents.read.v1"));
|
|
423
|
+
if (refusal) {
|
|
424
|
+
const { code, message } = refusal;
|
|
425
|
+
if (code === "document_not_found")
|
|
426
|
+
throw notFound(id);
|
|
427
|
+
if (code === "bundle_not_found" || code === "insufficient_scope") {
|
|
428
|
+
forget();
|
|
429
|
+
throw new RemoteError(message, code, 401);
|
|
430
|
+
}
|
|
431
|
+
if (TRANSIENT_READ_CODES.has(code))
|
|
432
|
+
throw new HostedCarrierError("unavailable");
|
|
433
|
+
throw new RemoteError(message, code, 422);
|
|
434
|
+
}
|
|
435
|
+
return decodeDocumentRead(id, answer.body, routes.read);
|
|
436
|
+
}
|
|
437
|
+
finally {
|
|
438
|
+
release();
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/** A heads answer's root version, checked against the held capabilities answer. */
|
|
442
|
+
function headsRootVersion(answer) {
|
|
443
|
+
const rootVersion = decodeRootVersion(answer.headers.get(ROOT_VERSION_HEADER));
|
|
444
|
+
if (rootVersion === undefined)
|
|
445
|
+
throw malformed("heads answered without the root version");
|
|
446
|
+
if (held && (held.root?.version ?? null) !== rootVersion)
|
|
447
|
+
forget();
|
|
448
|
+
return rootVersion;
|
|
449
|
+
}
|
|
450
|
+
/** Every page of one listing, from the first. The first request is the one a host from before
|
|
451
|
+
* paging answered, and so is its answer when the bundle fits in one page; a `304` is possible
|
|
452
|
+
* only there. A first answer that names `next` starts the pages. */
|
|
453
|
+
async function readHeads(ifNoneMatch) {
|
|
454
|
+
const pages = new HeadsPages();
|
|
455
|
+
let cursor;
|
|
456
|
+
for (;;) {
|
|
457
|
+
assertOpen();
|
|
458
|
+
const input = cursor === undefined ? { bundleId, ...(ifNoneMatch === undefined ? {} : { ifNoneMatch }) } : { bundleId, cursor };
|
|
459
|
+
const answer = await carrier.json(routes.heads, input, controller.signal, { maximum: HOSTED_READ_BOUNDS.headsBytes }).catch(carrierFailure);
|
|
460
|
+
if (answer.status !== 200 && !(answer.status === 304 && cursor === undefined))
|
|
461
|
+
refused(answer);
|
|
462
|
+
// Pages pin the documents, not the root: a root that moved between pages drops the held
|
|
463
|
+
// answer as any heads answer's root does, and the listing stands.
|
|
464
|
+
headsRootVersion(answer);
|
|
465
|
+
if (answer.status === 304) {
|
|
466
|
+
if (ifNoneMatch === undefined)
|
|
467
|
+
throw malformed("heads answered 304 to a request that sent no digest");
|
|
468
|
+
return null;
|
|
469
|
+
}
|
|
470
|
+
const next = answer.body?.next;
|
|
471
|
+
if (cursor === undefined && next === undefined)
|
|
472
|
+
return parseHeadsAnswer(answer.body);
|
|
473
|
+
cursor = pages.add(decodeHeadsPage(answer.body));
|
|
474
|
+
if (cursor === undefined)
|
|
475
|
+
return parseHeadsAnswer(pages.whole());
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/** One snapshot page's body; only the first page's refusal is the caller's refusal. */
|
|
479
|
+
async function snapshotPage(cursor) {
|
|
480
|
+
assertOpen();
|
|
481
|
+
const answer = await carrier.stream(routes.snapshot, cursor === undefined ? { bundleId } : { bundleId, cursor }, controller.signal).catch(carrierFailure);
|
|
482
|
+
if (!answer.ok) {
|
|
483
|
+
if (cursor === undefined)
|
|
484
|
+
refused(answer);
|
|
485
|
+
throw readRefusal(answer);
|
|
486
|
+
}
|
|
487
|
+
return boundedLines(answer.body, HOSTED_READ_BOUNDS.documentBytes);
|
|
488
|
+
}
|
|
489
|
+
const refuse = (code) => async () => {
|
|
490
|
+
throw new HostedReadAdapterError(code);
|
|
491
|
+
};
|
|
492
|
+
return {
|
|
493
|
+
signal: controller.signal,
|
|
494
|
+
read,
|
|
495
|
+
readMany: (ids) => Promise.all(ids.map(read)),
|
|
496
|
+
async readReserved(dir, name) {
|
|
497
|
+
if (dir !== "" || name !== "index.md")
|
|
498
|
+
return null;
|
|
499
|
+
const { root } = await capabilities();
|
|
500
|
+
return root ? { content: root.content, version: root.version } : null;
|
|
501
|
+
},
|
|
502
|
+
hostedCapabilities: capabilities,
|
|
503
|
+
operationsRetentionMs: async () => (await capabilities()).operationsRetentionMs,
|
|
504
|
+
async wireCapabilities() {
|
|
505
|
+
const { heads, snapshot, operations } = await capabilities();
|
|
506
|
+
return { heads, snapshot, operations, history: true, enforced_cas: true, projections: true, backlinks: false, blobs: false };
|
|
507
|
+
},
|
|
508
|
+
async heads(headsOptions = {}) {
|
|
509
|
+
assertOpen();
|
|
510
|
+
for (let attempt = 1;; attempt += 1) {
|
|
511
|
+
try {
|
|
512
|
+
return await onRoute(routes.heads, () => readHeads(headsOptions.ifNoneMatch));
|
|
513
|
+
}
|
|
514
|
+
catch (error) {
|
|
515
|
+
// The documents changed between two pages: after a pause, the listing starts again
|
|
516
|
+
// from the first page.
|
|
517
|
+
if (attempt >= HEADS_PAGE_ATTEMPTS || !isPageRestart(error))
|
|
518
|
+
throw error;
|
|
519
|
+
await (options.sleep ?? pause)(pageRestartDelay(attempt), controller.signal).catch(() => assertOpen());
|
|
520
|
+
assertOpen();
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
},
|
|
524
|
+
async snapshot() {
|
|
525
|
+
assertOpen();
|
|
526
|
+
// The first page's refusal is the snapshot's; a later page's failure (the bundle moved, the
|
|
527
|
+
// host refused or the carrier failed) ends the stitched body before its terminator, which
|
|
528
|
+
// the parser reports as truncation, so the caller re-requests the snapshot from the start.
|
|
529
|
+
// A body that names no next page passes through the stitch unchanged.
|
|
530
|
+
return onRoute(routes.snapshot, async () => {
|
|
531
|
+
const first = await snapshotPage(undefined);
|
|
532
|
+
const { header, docs } = await readSnapshotStream(stitchSnapshotPages(first, snapshotPage), { status: 200 });
|
|
533
|
+
return { header, docs: namingRoute(routes.snapshot, docs) };
|
|
534
|
+
});
|
|
535
|
+
},
|
|
536
|
+
abort() {
|
|
537
|
+
controller.abort();
|
|
538
|
+
forget();
|
|
539
|
+
for (const wake of waiting.splice(0))
|
|
540
|
+
wake();
|
|
541
|
+
},
|
|
542
|
+
// The shared verbs never take these paths against this authority: selection requires heads
|
|
543
|
+
// and snapshot, so the list path cannot run.
|
|
544
|
+
list: refuse("unsupported"),
|
|
545
|
+
exists: refuse("unsupported"),
|
|
546
|
+
versions: refuse("unsupported"),
|
|
547
|
+
readBlob: refuse("unsupported"),
|
|
548
|
+
existsBlob: refuse("unsupported"),
|
|
549
|
+
listBlobs: refuse("unsupported"),
|
|
550
|
+
write: refuse("read_only"),
|
|
551
|
+
writeReserved: refuse("read_only"),
|
|
552
|
+
delete: refuse("read_only"),
|
|
553
|
+
writeBlob: refuse("read_only"),
|
|
554
|
+
deleteBlob: refuse("read_only"),
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
//# sourceMappingURL=read-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-adapter.js","sourceRoot":"","sources":["../../src/hosted-transport/read-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAyC,MAAM,sBAAsB,CAAC;AAGnH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAyC,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AA0CjJ,6EAA6E;AAC7E,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACxE;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3D,yGAAyG;AACzG,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C,mHAAmH;AACnH,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,IAAI,KAAK,KAAK,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9C,4FAA4F;IAC5F,iBAAiB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IAClC,gGAAgG;IAChG,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IAC3B,yDAAyD;IACzD,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI;IACtC,+GAA+G;IAC/G,YAAY,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI;IACrC,+FAA+F;IAC/F,eAAe,EAAE,GAAG,GAAG,IAAI;IAC3B,yGAAyG;IACzG,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IACzB,mHAAmH;IACnH,aAAa,EAAE,EAAE,GAAG,IAAI;IACxB,2FAA2F;IAC3F,UAAU,EAAE,GAAG;IACf,0GAA0G;IAC1G,oBAAoB,EAAE,EAAE;IACxB,qFAAqF;IACrF,mBAAmB,EAAE,GAAG;IACxB,yBAAyB,EAAE,IAAI;IAC/B,+FAA+F;IAC/F,QAAQ,EAAE,GAAG;IACb,yFAAyF;IACzF,eAAe,EAAE,CAAC;CACnB,CAAC,CAAC;AAUH,MAAM,CAAC,MAAM,mBAAmB,GAAqB,MAAM,CAAC,MAAM,CAAC;IACjE,YAAY,EAAE,sBAAsB;IACpC,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,kBAAkB;IAC5B,IAAI,EAAE,cAAc;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAqB,MAAM,CAAC,MAAM,CAAC;IAC9D,YAAY,EAAE,uBAAuB;IACrC,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,mBAAmB;IAC7B,IAAI,EAAE,eAAe;CACtB,CAAC,CAAC;AAEH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC7B,IAAI,GAAG,wBAAwB,CAAC;IACzC,IAAI,CAA8B;IAC3C,YAAY,IAAiC;QAC3C,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAuBD,SAAS,QAAQ,CAAC,EAAa;IAC7B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAA6B,CAAC;IACnF,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAErD,SAAS,SAAS,CAAC,IAAa;IAC9B,MAAM,KAAK,GAAI,IAAmD,EAAE,KAAK,CAAC;IAC1E,OAAO,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACnG,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,WAAW,CAAC,MAAyC;IACnE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAClI,OAAO,IAAI,WAAW,CAAC,8BAA8B,MAAM,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACvF,CAAC;AAED,wGAAwG;AACxG,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,WAAW,CAAC,4BAA4B,EAAE,eAAe,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACrJ,MAAM,KAAK,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAe;IACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,MAAM,MAAM,GAAI,MAA2C,CAAC,kBAAkB,CAAC;IAC/E,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,SAAS,CAAC,0CAA0C,CAAC,CAAC;IACrI,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,MAAM,IAAI,GAAG,CAAC,GAAwC,EAAW,EAAE;QACjE,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,MAAM,SAAS,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QAClG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAA6D,CAAC;IACjF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;QACnH,MAAM,SAAS,CAAC,kDAAkD,CAAC,CAAC;IACtE,IAAI,IAAI,GAA+B,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,IAA4D,CAAC;QAC9E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;YAC9G,MAAM,SAAS,CAAC,8CAA8C,CAAC,CAAC;QAClE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,KAAK,GAAgC,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAuC,CAAC;QACzD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;YAC/G,MAAM,SAAS,CAAC,qDAAqD,CAAC,CAAC;QACzE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC;IAC7C,mFAAmF;IACnF,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,4BAA4B,CAAC;QACvG,MAAM,SAAS,CAAC,0DAA0D,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;QACpB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;QAC1B,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACxE,KAAK;QACL,IAAI;QACJ,qBAAqB,EAAE,SAAS,IAAI,+BAA+B;QACnE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC1H,UAAU,EAAE,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACjE,kBAAkB,EAAE,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC;KAC1D,CAAC,CAAC;AACL,CAAC;AAED,2GAA2G;AAC3G,SAAS,YAAY,CAAC,IAAgC,EAAE,OAAe;IACrE,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC,WAAW,CACrB,IAAI,eAAe,CAAyB;QAC1C,SAAS,CAAC,KAAK,EAAE,UAAU;YACzB,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;gBACnF,IAAI,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC;oBAC3C,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,yBAAyB,OAAO,QAAQ,CAAC,CAAC,CAAC;oBACtE,OAAO;gBACT,CAAC;gBACD,YAAY,GAAG,CAAC,CAAC;gBACjB,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;YACpB,CAAC;YACD,YAAY,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;YACzC,IAAI,YAAY,GAAG,OAAO,EAAE,CAAC;gBAC3B,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,yBAAyB,OAAO,QAAQ,CAAC,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YACD,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAE7I;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAa,EAAE,IAAa,EAAE,KAAc;IAC7E,MAAM,QAAQ,GAAG,IAA6J,CAAC;IAC/K,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC;IAChC,IAAI,QAAQ,EAAE,WAAW,KAAK,mBAAmB,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QACrJ,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI;QACpJ,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;QAC1E,MAAM,SAAS,CAAC,6FAA6F,EAAE,KAAK,CAAC,CAAC;IACxH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,WAA+C,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5I,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,mFAAmF;AACnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAoCtC,wCAAwC;AACxC,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,OAA6B;IAC1E,OAAO;QACL,QAAQ;QACR,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACnE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,KAAc,EAA+B,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACzH,MAAM,KAAK,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAE1H;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA6B,EAAE,IAAa,EAAE,KAAc;IAChG,MAAM,IAAI,GAAG,CAAC,GAAW,EAAS,EAAE;QAClC,MAAM,SAAS,CAAC,oBAAoB,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,IAA2E,CAAC;IAC7F,IAAI,QAAQ,EAAE,WAAW,KAAK,oBAAoB,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI;QAAE,IAAI,CAAC,2BAA2B,oBAAoB,WAAW,CAAC,CAAC;IAC7I,MAAM,IAAI,GAAG,QAAS,CAAC,IAAwG,CAAC;IAChI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/F,IAAI,IAAK,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU;QAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAK,CAAC,QAAQ,CAAC,IAAI,IAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACrI,IAAI,OAAO,IAAK,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,IAAK,CAAC,QAAqB,CAAC;IACzC,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC1D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAA4H,CAAC;QACzI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC3G,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAI,CAAC;QAChE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK;YAAE,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACxG,KAAK,GAAG,GAAa,CAAC;QACtB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YACpI,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACjF,IAAI,UAAU,eAAe,CAAC,OAAiB,CAAC,EAAE,KAAK,OAAO;gBAAE,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAClH,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACzC,CAAC;QACD,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,MAAM,CAAC;YACZ,GAAG,EAAE,GAAa;YAClB,OAAO,EAAE,OAAiB;YAC1B,KAAK,EAAE,KAAe;YACtB,SAAS,EAAE,SAAmB;YAC9B,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAe,EAAE,CAAC;YAC1D,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAiB,EAAE,CAAC;SACjE,CAAC,CACH,CAAC;IACJ,CAAC;IACD,wGAAwG;IACxG,IAAI,IAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC/F,IAAI,KAAyB,CAAC;IAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,+FAA+F;QAC/F,IAAI,CAAC,KAAK,CAAC,IAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAC5J,KAAK,GAAG,IAAK,CAAC,KAAe,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAK,CAAC,IAAe,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACtK,CAAC;AASD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAa,EAAE,WAAmB,EAAE,KAAc;IACjF,MAAM,QAAQ,GAAG,IAAsI,CAAC;IACxJ,IAAI,QAAQ,EAAE,EAAE,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACzJ,MAAM,SAAS,CAAC,kCAAkC,WAAW,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5E,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,6EAA6E;AAC7E,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,SAAS,SAAS,CAAC,IAAY,EAAE,OAAgB,EAAE,SAAkB;IACnE,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,EAAE,CAAC,CAAC;AACpG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAAyB;IACrD,MAAM,KAAK,GAAI,MAAM,CAAC,IAA+C,EAAE,KAAK,CAAC;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1F,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAmE,CAAC;IACzG,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/G,CAAC;AAKD,gEAAgE;AAChE,MAAM,UAAU,mBAAmB,CAAC,OAA6B,EAAE,IAAa,EAAE,KAAc;IAC9F,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;IACpE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;AAC5G,CAAC;AAED,oFAAoF;AACpF,KAAK,SAAS,CAAC,CAAC,WAAW,CAAI,KAAa,EAAE,SAA2B;IACvE,IAAI,CAAC;QACH,KAAK,CAAC,CAAC,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAiC;IACvE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,mBAAmB,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,IAAoC,CAAC;IACzC,IAAI,OAAgD,CAAC;IACrD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,IAAI,GAAG,SAAS,CAAC;QACjB,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC7E,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,MAAwD,EAAS,EAAE;QAClF,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,qFAAqF;QACrF,IAAI,KAAK,YAAY,WAAW,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,EAAE,CAAC;QACpE,MAAM,KAAK,CAAC;IACd,CAAC,CAAC;IACF,KAAK,UAAU,OAAO;QACpB,IAAI,QAAQ,GAAG,kBAAkB,CAAC,eAAe,EAAE,CAAC;YAClD,QAAQ,IAAI,CAAC,CAAC;YACd,OAAO;QACT,CAAC;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,SAAS,OAAO;QACd,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;;YACZ,QAAQ,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,SAAS,YAAY;QACnB,IAAI,IAAI;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,UAAU,EAAE,CAAC;QACb,MAAM,OAAO,GAAgC,OAAO;aACjD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;aAC7G,KAAK,CAAC,cAAc,CAAC;aACrB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,OAAO,CAAC;QAClB,2GAA2G;QAC3G,OAAO,CAAC,IAAI,CACV,CAAC,OAAO,EAAE,EAAE;YACV,IAAI,OAAO,KAAK,OAAO;gBAAE,IAAI,GAAG,OAAO,CAAC;QAC1C,CAAC,EACD,GAAG,EAAE;YACH,IAAI,OAAO,KAAK,OAAO;gBAAE,OAAO,GAAG,SAAS,CAAC;QAC/C,CAAC,CACF,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,KAAK,UAAU,IAAI,CAAC,EAAa;QAC/B,UAAU,EAAE,CAAC;QACb,MAAM,OAAO,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,UAAU,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,OAAO;iBACzB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;iBAC3K,KAAK,CAAC,cAAc,CAAC,CAAC;YACzB,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;YAC3G,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;gBAClC,IAAI,IAAI,KAAK,oBAAoB;oBAAE,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtD,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;oBACjE,MAAM,EAAE,CAAC;oBACT,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,MAAM,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;gBAChF,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,mFAAmF;IACnF,SAAS,gBAAgB,CAAC,MAAoB;QAC5C,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC/E,IAAI,WAAW,KAAK,SAAS;YAAE,MAAM,SAAS,CAAC,yCAAyC,CAAC,CAAC;QAC1F,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,WAAW;YAAE,MAAM,EAAE,CAAC;QACnE,OAAO,WAAW,CAAC;IACrB,CAAC;IACD;;wEAEoE;IACpE,KAAK,UAAU,SAAS,CAAC,WAA+B;QACtD,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,MAA0B,CAAC;QAC/B,SAAS,CAAC;YACR,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YAChI,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC5I,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,SAAS,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/F,wFAAwF;YACxF,kEAAkE;YAClE,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,IAAI,WAAW,KAAK,SAAS;oBAAE,MAAM,SAAS,CAAC,qDAAqD,CAAC,CAAC;gBACtG,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,GAAI,MAAM,CAAC,IAAkC,EAAE,IAAI,CAAC;YAC9D,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrF,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,uFAAuF;IACvF,KAAK,UAAU,YAAY,CAAC,MAA0B;QACpD,UAAU,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC1J,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,IAAoC,EAAE,EAAE,CAAC,KAAK,IAAoB,EAAE;QAClF,MAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC;IACF,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,IAAI;QACJ,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,IAAsB;YACpD,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YACnD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,CAAC;QACD,kBAAkB,EAAE,YAAY;QAChC,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,qBAAqB;QAC/E,KAAK,CAAC,gBAAgB;YACpB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;YAC7D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC/H,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE;YAC3B,UAAU,EAAE,CAAC;YACb,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;gBAChF,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,mFAAmF;oBACnF,uBAAuB;oBACvB,IAAI,OAAO,IAAI,mBAAmB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAC;oBACzE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;oBACvG,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,UAAU,EAAE,CAAC;YACb,4FAA4F;YAC5F,0FAA0F;YAC1F,2FAA2F;YAC3F,sEAAsE;YACtE,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACzC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC5C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC7G,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YAC9D,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK;YACH,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC;YACT,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,IAAI,EAAE,CAAC;QAC/C,CAAC;QACD,2FAA2F;QAC3F,6CAA6C;QAC7C,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC;QAC/B,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC;QACjC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC;QAClC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;QAC9B,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC;KAChC,CAAC;AACJ,CAAC"}
|