@agentplat/mesh-protocol 0.3.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,613 @@
1
+ import { canonicalizeJsonValue } from './canonical-json.js';
2
+ import { DEFAULT_MESH_PROTOCOL_LIMITS, MESH_AUDIENCE_TOPICS, MESH_MESSAGE_TYPES, MESH_PROTOCOL, MESH_SIGNATURE_ALGORITHM, MESH_WIRE_VERSION, } from './contracts.js';
3
+ import { parseStrictJsonDocument, } from './strict-json.js';
4
+ const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9._:@-]*$/;
5
+ const base64UrlPattern = /^[A-Za-z0-9_-]+$/;
6
+ const rfc3339Pattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?(Z|([+-])(\d{2}):(\d{2}))$/;
7
+ const base64UrlAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
8
+ const maximumIssuePathLength = 256;
9
+ const knownMessageTypes = new Set(MESH_MESSAGE_TYPES);
10
+ const knownTopics = new Set(MESH_AUDIENCE_TOPICS);
11
+ const utf8Encoder = new TextEncoder();
12
+ const topLevelRequiredKeys = Object.freeze([
13
+ 'audience',
14
+ 'expiresAt',
15
+ 'meshId',
16
+ 'messageId',
17
+ 'payload',
18
+ 'payloadHash',
19
+ 'proof',
20
+ 'protocol',
21
+ 'sender',
22
+ 'sentAt',
23
+ 'sequence',
24
+ 'tenantId',
25
+ 'type',
26
+ 'wireVersion',
27
+ ]);
28
+ const topLevelOptionalKeys = Object.freeze([
29
+ 'causationId',
30
+ 'correlationId',
31
+ 'criticalExtensions',
32
+ 'extensions',
33
+ 'objectiveId',
34
+ ]);
35
+ class ValidationFailure extends Error {
36
+ code;
37
+ path;
38
+ constructor(code, path) {
39
+ super(code);
40
+ this.code = code;
41
+ this.path = path;
42
+ }
43
+ }
44
+ /** Strictly parses any bounded JSON value without losing duplicate-key data. */
45
+ export function parseMeshJson(input, options = {}) {
46
+ const limits = resolveLimits(options.limits);
47
+ const parsed = parseStrictJsonDocument(input, strictLimits(limits));
48
+ if (!parsed.ok)
49
+ return failure(parsed.code, parsed.path);
50
+ return success(parsed.value);
51
+ }
52
+ /** Canonicalizes an I-JSON-compatible value using RFC 8785 ordering rules. */
53
+ export function canonicalizeMeshJson(input, options = {}) {
54
+ const result = canonicalizeMeshJsonInternal(input, options);
55
+ return result.ok ? success(result.value) : result;
56
+ }
57
+ /** Canonicalizes a value and returns the exact UTF-8 bytes used by hashing. */
58
+ export function canonicalizeMeshJsonBytes(input, options = {}) {
59
+ const result = canonicalizeMeshJsonInternal(input, options);
60
+ return result.ok ? success(result.bytes) : result;
61
+ }
62
+ /** Compares two timestamps using the exact protocol v0 timestamp profile. */
63
+ export function compareMeshTimestamps(left, right) {
64
+ try {
65
+ const leftInstant = parseRfc3339(assertString(left, '$["left"]', 'invalid_timestamp'), '$["left"]');
66
+ const rightInstant = parseRfc3339(assertString(right, '$["right"]', 'invalid_timestamp'), '$["right"]');
67
+ return success(leftInstant < rightInstant ? -1 : leftInstant > rightInstant ? 1 : 0);
68
+ }
69
+ catch (error) {
70
+ return validationFailure(error);
71
+ }
72
+ }
73
+ /**
74
+ * Parses and statically validates one complete Alpha 1 envelope.
75
+ * This stage does not verify the payload digest or proof.
76
+ */
77
+ export function parseSignedMeshEnvelope(input, options = {}) {
78
+ const limits = resolveLimits(options.limits);
79
+ const parsed = parseStrictJsonDocument(input, strictLimits(limits));
80
+ if (!parsed.ok)
81
+ return failure(parsed.code, parsed.path);
82
+ if (parsed.payloadByteLength !== undefined &&
83
+ parsed.payloadByteLength > limits.maximumPayloadBytes) {
84
+ return failure('structural_limit_exceeded', '$["payload"]');
85
+ }
86
+ return validateSignedMeshEnvelope(parsed.value, { limits });
87
+ }
88
+ /**
89
+ * Validates an in-memory envelope and returns a deeply frozen signed value.
90
+ * This stage does not verify the payload digest or proof.
91
+ */
92
+ export function validateSignedMeshEnvelope(input, options = {}) {
93
+ const limits = resolveLimits(options.limits);
94
+ try {
95
+ const envelopeCanonicalization = canonicalizeJsonValue(input, strictLimits(limits), limits.maximumEnvelopeBytes);
96
+ if (!envelopeCanonicalization.ok) {
97
+ return failure(envelopeCanonicalization.code, envelopeCanonicalization.path);
98
+ }
99
+ const envelope = validateEnvelope(input, limits);
100
+ const payloadCanonicalization = canonicalizeJsonValue(envelope.payload, strictLimits(limits), limits.maximumPayloadBytes);
101
+ if (!payloadCanonicalization.ok) {
102
+ return failure(payloadCanonicalization.code, prefixPath('$["payload"]', payloadCanonicalization.path));
103
+ }
104
+ return success(deepFreeze(envelope));
105
+ }
106
+ catch (error) {
107
+ return validationFailure(error);
108
+ }
109
+ }
110
+ /**
111
+ * Applies receiver scope, freshness and critical-extension support.
112
+ * This stage does not perform peer admission or replay acceptance.
113
+ */
114
+ export function validateMeshEnvelopeContext(envelope, context, options = {}) {
115
+ const limits = resolveLimits(options.limits);
116
+ try {
117
+ const structuralValidation = validateSignedMeshEnvelope(envelope, {
118
+ limits,
119
+ });
120
+ if (!structuralValidation.ok)
121
+ return structuralValidation;
122
+ const validatedEnvelope = structuralValidation.value;
123
+ assertIdentifier(context.tenantId, '$context["tenantId"]', limits);
124
+ assertIdentifier(context.meshId, '$context["meshId"]', limits);
125
+ assertIdentifier(context.peerId, '$context["peerId"]', limits);
126
+ if (validatedEnvelope.tenantId !== context.tenantId ||
127
+ validatedEnvelope.meshId !== context.meshId) {
128
+ fail('scope_mismatch', '$');
129
+ }
130
+ if (validatedEnvelope.audience.kind === 'peer') {
131
+ if (validatedEnvelope.audience.peerId !== context.peerId) {
132
+ fail('invalid_audience', '$["audience"]');
133
+ }
134
+ }
135
+ else if (!context.subscribedTopics?.includes(validatedEnvelope.audience.topic)) {
136
+ fail('invalid_audience', '$["audience"]["topic"]');
137
+ }
138
+ const receivedAt = parseRfc3339(assertString(context.receivedAt, '$context["receivedAt"]', 'invalid_timestamp'), '$context["receivedAt"]');
139
+ const sentAt = parseRfc3339(validatedEnvelope.sentAt, '$["sentAt"]');
140
+ const expiresAt = parseRfc3339(validatedEnvelope.expiresAt, '$["expiresAt"]');
141
+ if (sentAt >
142
+ receivedAt + BigInt(limits.clockSkewAllowanceMs) * 1000000n) {
143
+ fail('message_from_future', '$["sentAt"]');
144
+ }
145
+ if (expiresAt <= receivedAt) {
146
+ fail('message_expired', '$["expiresAt"]');
147
+ }
148
+ const supported = new Set(context.supportedCriticalExtensions ?? []);
149
+ for (const [index, extension] of (validatedEnvelope.criticalExtensions ?? []).entries()) {
150
+ if (!supported.has(extension)) {
151
+ fail('unknown_critical_extension', `$["criticalExtensions"][${index}]`);
152
+ }
153
+ }
154
+ return success(validatedEnvelope);
155
+ }
156
+ catch (error) {
157
+ return validationFailure(error);
158
+ }
159
+ }
160
+ /** Builds the closed document whose canonical bytes are signed. */
161
+ export function createMeshSigningDocument(envelope) {
162
+ const document = {
163
+ protocol: envelope.protocol,
164
+ wireVersion: envelope.wireVersion,
165
+ messageId: envelope.messageId,
166
+ tenantId: envelope.tenantId,
167
+ meshId: envelope.meshId,
168
+ ...(envelope.objectiveId === undefined
169
+ ? {}
170
+ : { objectiveId: envelope.objectiveId }),
171
+ type: envelope.type,
172
+ sender: envelope.sender,
173
+ audience: envelope.audience,
174
+ sequence: envelope.sequence,
175
+ sentAt: envelope.sentAt,
176
+ expiresAt: envelope.expiresAt,
177
+ payloadHash: envelope.payloadHash,
178
+ ...(envelope.correlationId === undefined
179
+ ? {}
180
+ : { correlationId: envelope.correlationId }),
181
+ ...(envelope.causationId === undefined
182
+ ? {}
183
+ : { causationId: envelope.causationId }),
184
+ ...(envelope.extensions === undefined
185
+ ? {}
186
+ : { extensions: envelope.extensions }),
187
+ ...(envelope.criticalExtensions === undefined
188
+ ? {}
189
+ : { criticalExtensions: envelope.criticalExtensions }),
190
+ proof: {
191
+ algorithm: envelope.proof.algorithm,
192
+ keyId: envelope.proof.keyId,
193
+ },
194
+ };
195
+ return deepFreeze(document);
196
+ }
197
+ /** Returns canonical signing-document bytes without the payload or signature. */
198
+ export function canonicalizeMeshSigningDocument(envelope, options = {}) {
199
+ return canonicalizeMeshJsonBytes(createMeshSigningDocument(envelope), options);
200
+ }
201
+ /** Returns canonical payload bytes used by the reference digest contract. */
202
+ export function canonicalizeMeshPayload(payload, options = {}) {
203
+ const limits = resolveLimits(options.limits);
204
+ const result = canonicalizeJsonValue(payload, strictLimits(limits), limits.maximumPayloadBytes);
205
+ return result.ok ? success(result.bytes) : failure(result.code, result.path);
206
+ }
207
+ function validateEnvelope(input, limits) {
208
+ const envelope = assertClosedRecord(input, [], [...topLevelRequiredKeys, ...topLevelOptionalKeys], '$', 'unknown_envelope_field');
209
+ if (envelope.protocol !== MESH_PROTOCOL) {
210
+ fail('invalid_protocol', '$["protocol"]');
211
+ }
212
+ if (envelope.wireVersion !== MESH_WIRE_VERSION) {
213
+ fail('unsupported_wire_version', '$["wireVersion"]');
214
+ }
215
+ const messageId = assertMessageId(envelope.messageId, '$["messageId"]');
216
+ const tenantId = assertIdentifier(envelope.tenantId, '$["tenantId"]', limits);
217
+ const meshId = assertIdentifier(envelope.meshId, '$["meshId"]', limits);
218
+ const objectiveId = envelope.objectiveId === undefined
219
+ ? undefined
220
+ : assertIdentifier(envelope.objectiveId, '$["objectiveId"]', limits);
221
+ const type = assertString(envelope.type, '$["type"]', 'unsupported_message_type');
222
+ if (!knownMessageTypes.has(type)) {
223
+ fail('unsupported_message_type', '$["type"]');
224
+ }
225
+ if (!isAlphaOneMessageType(type)) {
226
+ fail('unsupported_message_type', '$["type"]');
227
+ }
228
+ const sender = validateSender(envelope.sender, limits);
229
+ const audience = validateAudience(envelope.audience, limits);
230
+ const sequence = assertPositiveSafeInteger(envelope.sequence, '$["sequence"]');
231
+ const sentAtText = assertString(envelope.sentAt, '$["sentAt"]', 'invalid_timestamp');
232
+ const expiresAtText = assertString(envelope.expiresAt, '$["expiresAt"]', 'invalid_timestamp');
233
+ const sentAt = parseRfc3339(sentAtText, '$["sentAt"]');
234
+ const expiresAt = parseRfc3339(expiresAtText, '$["expiresAt"]');
235
+ validateLifetime(type, sentAt, expiresAt, limits);
236
+ const correlationId = envelope.correlationId === undefined
237
+ ? undefined
238
+ : assertMessageId(envelope.correlationId, '$["correlationId"]');
239
+ const causationId = envelope.causationId === undefined
240
+ ? undefined
241
+ : assertMessageId(envelope.causationId, '$["causationId"]');
242
+ const payloadHash = assertPayloadHash(envelope.payloadHash, '$["payloadHash"]');
243
+ const payload = validatePayload(type, envelope.payload, limits);
244
+ const proof = validateProof(envelope.proof, limits);
245
+ const extensions = envelope.extensions === undefined
246
+ ? undefined
247
+ : validateExtensions(envelope.extensions, limits);
248
+ const criticalExtensions = envelope.criticalExtensions === undefined
249
+ ? undefined
250
+ : validateCriticalExtensions(envelope.criticalExtensions, extensions, limits);
251
+ if (payload.type !== type) {
252
+ fail('type_payload_mismatch', '$["payload"]["type"]');
253
+ }
254
+ validateMessageSpecificEnvelope(type, audience, objectiveId, causationId);
255
+ return {
256
+ protocol: MESH_PROTOCOL,
257
+ wireVersion: MESH_WIRE_VERSION,
258
+ messageId,
259
+ tenantId,
260
+ meshId,
261
+ ...(objectiveId === undefined ? {} : { objectiveId }),
262
+ type,
263
+ sender,
264
+ audience,
265
+ sequence,
266
+ sentAt: sentAtText,
267
+ expiresAt: expiresAtText,
268
+ payloadHash,
269
+ payload,
270
+ proof,
271
+ ...(correlationId === undefined ? {} : { correlationId }),
272
+ ...(causationId === undefined ? {} : { causationId }),
273
+ ...(extensions === undefined ? {} : { extensions }),
274
+ ...(criticalExtensions === undefined ? {} : { criticalExtensions }),
275
+ };
276
+ }
277
+ function validateSender(input, limits) {
278
+ const sender = assertClosedRecord(input, ['instanceId', 'peerId'], [], '$["sender"]', 'invalid_payload');
279
+ return {
280
+ peerId: assertIdentifier(sender.peerId, '$["sender"]["peerId"]', limits),
281
+ instanceId: assertIdentifier(sender.instanceId, '$["sender"]["instanceId"]', limits),
282
+ };
283
+ }
284
+ function validateAudience(input, limits) {
285
+ const audience = assertRecord(input, '$["audience"]', 'invalid_audience');
286
+ if (audience.kind === 'peer') {
287
+ assertExactKeys(audience, ['kind', 'peerId'], '$["audience"]', 'invalid_audience');
288
+ return {
289
+ kind: 'peer',
290
+ peerId: assertIdentifier(audience.peerId, '$["audience"]["peerId"]', limits),
291
+ };
292
+ }
293
+ if (audience.kind === 'mesh') {
294
+ assertExactKeys(audience, ['kind', 'topic'], '$["audience"]', 'invalid_audience');
295
+ const topic = assertString(audience.topic, '$["audience"]["topic"]', 'invalid_audience');
296
+ if (!knownTopics.has(topic)) {
297
+ fail('invalid_audience', '$["audience"]["topic"]');
298
+ }
299
+ return { kind: 'mesh', topic: topic };
300
+ }
301
+ return fail('invalid_audience', '$["audience"]["kind"]');
302
+ }
303
+ function validatePayload(type, input, limits) {
304
+ if (type === 'peer.hello') {
305
+ const payload = assertClosedRecord(input, ['cardRevision', 'peerCardId', 'type'], [], '$["payload"]', 'invalid_payload');
306
+ const result = {
307
+ type: assertPayloadType(payload.type, type),
308
+ peerCardId: assertIdentifier(payload.peerCardId, '$["payload"]["peerCardId"]', limits),
309
+ cardRevision: assertPositiveSafeInteger(payload.cardRevision, '$["payload"]["cardRevision"]', 'invalid_payload'),
310
+ };
311
+ return result;
312
+ }
313
+ if (type === 'peer.ping') {
314
+ const payload = assertClosedRecord(input, ['type'], [], '$["payload"]', 'invalid_payload');
315
+ const result = {
316
+ type: assertPayloadType(payload.type, type),
317
+ };
318
+ return result;
319
+ }
320
+ const payload = assertClosedRecord(input, ['type'], [], '$["payload"]', 'invalid_payload');
321
+ const result = {
322
+ type: assertPayloadType(payload.type, 'peer.ping_ack'),
323
+ };
324
+ return result;
325
+ }
326
+ function validateProof(input, limits) {
327
+ const proof = assertClosedRecord(input, ['algorithm', 'keyId', 'value'], [], '$["proof"]', 'invalid_proof');
328
+ if (proof.algorithm !== MESH_SIGNATURE_ALGORITHM) {
329
+ fail('invalid_proof', '$["proof"]["algorithm"]');
330
+ }
331
+ const value = assertString(proof.value, '$["proof"]["value"]', 'invalid_proof');
332
+ if (!isCanonicalBase64Url(value, 64)) {
333
+ fail('invalid_proof', '$["proof"]["value"]');
334
+ }
335
+ return {
336
+ algorithm: MESH_SIGNATURE_ALGORITHM,
337
+ keyId: assertIdentifier(proof.keyId, '$["proof"]["keyId"]', limits),
338
+ value,
339
+ };
340
+ }
341
+ function validateExtensions(input, limits) {
342
+ const extensions = assertRecord(input, '$["extensions"]', 'invalid_extension');
343
+ const keys = Object.keys(extensions);
344
+ if (keys.length > limits.maximumExtensions) {
345
+ fail('structural_limit_exceeded', '$["extensions"]');
346
+ }
347
+ const canonical = canonicalizeJsonValue(extensions, strictLimits(limits), limits.maximumEnvelopeBytes);
348
+ if (!canonical.ok) {
349
+ fail(canonical.code, prefixPath('$["extensions"]', canonical.path));
350
+ }
351
+ return extensions;
352
+ }
353
+ function validateCriticalExtensions(input, extensions, limits) {
354
+ if (!Array.isArray(input)) {
355
+ fail('invalid_extension', '$["criticalExtensions"]');
356
+ }
357
+ if (input.length > limits.maximumCriticalExtensions) {
358
+ fail('structural_limit_exceeded', '$["criticalExtensions"]');
359
+ }
360
+ const seen = new Set();
361
+ const result = [];
362
+ for (const [index, value] of input.entries()) {
363
+ const key = assertString(value, `$["criticalExtensions"][${index}]`, 'invalid_extension');
364
+ if (key.length === 0 ||
365
+ seen.has(key) ||
366
+ !Object.hasOwn(extensions ?? {}, key)) {
367
+ fail('invalid_extension', `$["criticalExtensions"][${index}]`);
368
+ }
369
+ seen.add(key);
370
+ result.push(key);
371
+ }
372
+ return result;
373
+ }
374
+ function validateMessageSpecificEnvelope(type, audience, objectiveId, causationId) {
375
+ if (type === 'peer.hello') {
376
+ if (audience.kind === 'mesh' && audience.topic !== 'membership') {
377
+ fail('invalid_audience', '$["audience"]["topic"]');
378
+ }
379
+ return;
380
+ }
381
+ if (audience.kind !== 'peer') {
382
+ fail('invalid_audience', '$["audience"]');
383
+ }
384
+ if (objectiveId !== undefined) {
385
+ fail('invalid_payload', '$["objectiveId"]');
386
+ }
387
+ if (type === 'peer.ping_ack' && causationId === undefined) {
388
+ fail('invalid_payload', '$["causationId"]');
389
+ }
390
+ }
391
+ function validateLifetime(type, sentAt, expiresAt, limits) {
392
+ if (expiresAt <= sentAt) {
393
+ fail('invalid_lifetime', '$["expiresAt"]');
394
+ }
395
+ const messageMaximum = type === 'peer.hello' ? 120_000 : 30_000;
396
+ const maximum = Math.min(limits.maximumLifetimeMs, messageMaximum);
397
+ if (expiresAt - sentAt > BigInt(maximum) * 1000000n) {
398
+ fail('invalid_lifetime', '$["expiresAt"]');
399
+ }
400
+ }
401
+ function assertPayloadType(input, expected) {
402
+ if (typeof input !== 'string') {
403
+ fail('invalid_payload', '$["payload"]["type"]');
404
+ }
405
+ if (input !== expected) {
406
+ fail('type_payload_mismatch', '$["payload"]["type"]');
407
+ }
408
+ return expected;
409
+ }
410
+ function assertPayloadHash(input, path) {
411
+ const value = assertString(input, path, 'invalid_payload_hash');
412
+ if (!value.startsWith('sha256:') ||
413
+ !isCanonicalBase64Url(value.slice('sha256:'.length), 32)) {
414
+ fail('invalid_payload_hash', path);
415
+ }
416
+ return value;
417
+ }
418
+ function assertMessageId(input, path) {
419
+ const value = assertString(input, path, 'invalid_message_id');
420
+ if (!isCanonicalBase64Url(value, 16)) {
421
+ fail('invalid_message_id', path);
422
+ }
423
+ return value;
424
+ }
425
+ function assertIdentifier(input, path, limits) {
426
+ const value = assertString(input, path, 'invalid_identifier');
427
+ if (value.length > limits.maximumIdBytes || !identifierPattern.test(value)) {
428
+ fail('invalid_identifier', path);
429
+ }
430
+ return value;
431
+ }
432
+ function assertPositiveSafeInteger(input, path, code = 'invalid_sequence') {
433
+ if (typeof input !== 'number' || !Number.isSafeInteger(input) || input < 1) {
434
+ fail(code, path);
435
+ }
436
+ return input;
437
+ }
438
+ function assertString(input, path, code = 'invalid_payload') {
439
+ if (typeof input !== 'string')
440
+ fail(code, path);
441
+ return input;
442
+ }
443
+ function assertClosedRecord(input, requiredKeys, optionalKeys, path, code) {
444
+ const record = assertRecord(input, path, code);
445
+ const allowed = new Set([...requiredKeys, ...optionalKeys]);
446
+ for (const key of Object.keys(record)) {
447
+ if (!allowed.has(key)) {
448
+ fail(code, `${path}[${JSON.stringify(key)}]`);
449
+ }
450
+ }
451
+ for (const key of requiredKeys) {
452
+ if (!Object.hasOwn(record, key)) {
453
+ fail(code, `${path}[${JSON.stringify(key)}]`);
454
+ }
455
+ }
456
+ return record;
457
+ }
458
+ function assertExactKeys(record, keys, path, code) {
459
+ const expected = new Set(keys);
460
+ const actual = Object.keys(record);
461
+ if (actual.length !== expected.size ||
462
+ actual.some((key) => !expected.has(key))) {
463
+ fail(code, path);
464
+ }
465
+ }
466
+ function assertRecord(input, path, code) {
467
+ if (input === null || typeof input !== 'object' || Array.isArray(input)) {
468
+ fail(code, path);
469
+ }
470
+ const prototype = Object.getPrototypeOf(input);
471
+ if (prototype !== Object.prototype && prototype !== null) {
472
+ fail(code, path);
473
+ }
474
+ const names = Object.getOwnPropertyNames(input);
475
+ if (Object.getOwnPropertySymbols(input).length > 0 ||
476
+ names.some((name) => {
477
+ const descriptor = Object.getOwnPropertyDescriptor(input, name);
478
+ return !descriptor || !descriptor.enumerable || !('value' in descriptor);
479
+ })) {
480
+ fail(code, path);
481
+ }
482
+ return input;
483
+ }
484
+ function parseRfc3339(input, path) {
485
+ const match = rfc3339Pattern.exec(input);
486
+ if (!match)
487
+ return fail('invalid_timestamp', path);
488
+ const [, yearText, monthText, dayText, hourText, minuteText, secondText, fractionText = '', zone, offsetSign, offsetHourText, offsetMinuteText,] = match;
489
+ const year = Number(yearText);
490
+ const month = Number(monthText);
491
+ const day = Number(dayText);
492
+ const hour = Number(hourText);
493
+ const minute = Number(minuteText);
494
+ const second = Number(secondText);
495
+ if (year < 1970 ||
496
+ month < 1 ||
497
+ month > 12 ||
498
+ day < 1 ||
499
+ day > daysInMonth(year, month) ||
500
+ hour > 23 ||
501
+ minute > 59 ||
502
+ second > 59) {
503
+ return fail('invalid_timestamp', path);
504
+ }
505
+ let offsetMinutes = 0;
506
+ if (zone !== 'Z') {
507
+ const offsetHours = Number(offsetHourText);
508
+ const offsetMinute = Number(offsetMinuteText);
509
+ if (offsetHours > 23 || offsetMinute > 59) {
510
+ return fail('invalid_timestamp', path);
511
+ }
512
+ offsetMinutes =
513
+ (offsetHours * 60 + offsetMinute) * (offsetSign === '+' ? 1 : -1);
514
+ }
515
+ const milliseconds = Date.UTC(year, month - 1, day, hour, minute, second) -
516
+ offsetMinutes * 60_000;
517
+ const fractionNanoseconds = BigInt(fractionText.padEnd(9, '0'));
518
+ return BigInt(milliseconds) * 1000000n + fractionNanoseconds;
519
+ }
520
+ function daysInMonth(year, month) {
521
+ if (month === 2) {
522
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28;
523
+ }
524
+ return [4, 6, 9, 11].includes(month) ? 30 : 31;
525
+ }
526
+ function isCanonicalBase64Url(value, expectedBytes) {
527
+ const expectedCharacters = Math.ceil((expectedBytes * 8) / 6);
528
+ if (value.length !== expectedCharacters || !base64UrlPattern.test(value)) {
529
+ return false;
530
+ }
531
+ const significantBits = (expectedBytes * 8) % 6;
532
+ if (significantBits === 0)
533
+ return true;
534
+ const finalIndex = base64UrlAlphabet.indexOf(value[value.length - 1]);
535
+ const unusedBits = 6 - significantBits;
536
+ return (finalIndex & ((1 << unusedBits) - 1)) === 0;
537
+ }
538
+ function isAlphaOneMessageType(value) {
539
+ return (value === 'peer.hello' || value === 'peer.ping' || value === 'peer.ping_ack');
540
+ }
541
+ function canonicalizeMeshJsonInternal(input, options) {
542
+ const limits = resolveLimits(options.limits);
543
+ const result = canonicalizeJsonValue(input, strictLimits(limits), limits.maximumEnvelopeBytes);
544
+ return result.ok
545
+ ? result
546
+ : {
547
+ ok: false,
548
+ issues: [{ code: result.code, path: result.path }],
549
+ };
550
+ }
551
+ function resolveLimits(overrides) {
552
+ const result = {
553
+ ...DEFAULT_MESH_PROTOCOL_LIMITS,
554
+ };
555
+ if (overrides) {
556
+ for (const key of Object.keys(overrides)) {
557
+ const value = overrides[key];
558
+ if (value !== undefined && (!Number.isSafeInteger(value) || value < 1)) {
559
+ throw new RangeError(`Invalid Mesh protocol limit: ${key}`);
560
+ }
561
+ if (value !== undefined)
562
+ result[key] = value;
563
+ }
564
+ }
565
+ return Object.freeze(result);
566
+ }
567
+ function strictLimits(limits) {
568
+ return {
569
+ maximumEnvelopeBytes: limits.maximumEnvelopeBytes,
570
+ maximumNestingDepth: limits.maximumNestingDepth,
571
+ maximumTotalObjectKeys: limits.maximumTotalObjectKeys,
572
+ maximumObjectKeys: limits.maximumObjectKeys,
573
+ maximumTotalArrayItems: limits.maximumTotalArrayItems,
574
+ maximumArrayItems: limits.maximumArrayItems,
575
+ maximumStringBytes: limits.maximumStringBytes,
576
+ };
577
+ }
578
+ function deepFreeze(value) {
579
+ if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
580
+ Object.freeze(value);
581
+ for (const nested of Object.values(value))
582
+ deepFreeze(nested);
583
+ }
584
+ return value;
585
+ }
586
+ function prefixPath(prefix, nested) {
587
+ return nested === '$' ? prefix : `${prefix}${nested.slice(1)}`;
588
+ }
589
+ function success(value) {
590
+ return { ok: true, value };
591
+ }
592
+ function failure(code, path) {
593
+ return { ok: false, issues: [{ code, path: boundIssuePath(path) }] };
594
+ }
595
+ function validationFailure(error) {
596
+ if (error instanceof ValidationFailure) {
597
+ return failure(error.code, error.path);
598
+ }
599
+ return failure('invalid_json_value', '$');
600
+ }
601
+ function fail(code, path) {
602
+ throw new ValidationFailure(code, path);
603
+ }
604
+ function boundIssuePath(path) {
605
+ if (path.length <= maximumIssuePathLength)
606
+ return path;
607
+ let end = maximumIssuePathLength - 3;
608
+ const finalCodeUnit = path.charCodeAt(end - 1);
609
+ if (finalCodeUnit >= 0xd800 && finalCodeUnit <= 0xdbff)
610
+ end -= 1;
611
+ return `${path.slice(0, end)}...`;
612
+ }
613
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACxB,iBAAiB,GAkBlB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,GAExB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,iBAAiB,GAAG,gCAAgC,CAAC;AAC3D,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAC5C,MAAM,cAAc,GAClB,4FAA4F,CAAC;AAC/F,MAAM,iBAAiB,GACrB,kEAAkE,CAAC;AACrE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS,kBAAkB,CAAC,CAAC;AAC9D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,oBAAoB,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,UAAU;IACV,WAAW;IACX,QAAQ;IACR,WAAW;IACX,SAAS;IACT,aAAa;IACb,OAAO;IACP,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,UAAU;IACV,MAAM;IACN,aAAa;CACd,CAAC,CAAC;AACH,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,aAAa;IACb,eAAe;IACf,oBAAoB;IACpB,YAAY;IACZ,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,iBAAkB,SAAQ,KAAK;IAExB;IACA;IAFX,YACW,IAA2B,EAC3B,IAAY;QAErB,KAAK,CAAC,IAAI,CAAC,CAAC;QAHH,SAAI,GAAJ,IAAI,CAAuB;QAC3B,SAAI,GAAJ,IAAI,CAAQ;IAGvB,CAAC;CACF;AAED,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAC3B,KAA0B,EAC1B,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAsB,CAAC,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAClC,KAAc,EACd,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACpD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CACvC,KAAc,EACd,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACpD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,YAAY,CAC9B,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,mBAAmB,CAAC,EACpD,WAAW,CACZ,CAAC;QACF,MAAM,YAAY,GAAG,YAAY,CAC/B,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,mBAAmB,CAAC,EACtD,YAAY,CACb,CAAC;QACF,OAAO,OAAO,CACZ,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAiB,EACjB,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IACE,MAAM,CAAC,iBAAiB,KAAK,SAAS;QACtC,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,EACrD,CAAC;QACD,OAAO,OAAO,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,0BAA0B,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAc,EACd,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,wBAAwB,GAAG,qBAAqB,CACpD,KAAK,EACL,YAAY,CAAC,MAAM,CAAC,EACpB,MAAM,CAAC,oBAAoB,CAC5B,CAAC;QACF,IAAI,CAAC,wBAAwB,CAAC,EAAE,EAAE,CAAC;YACjC,OAAO,OAAO,CACZ,wBAAwB,CAAC,IAAI,EAC7B,wBAAwB,CAAC,IAAI,CAC9B,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,uBAAuB,GAAG,qBAAqB,CACnD,QAAQ,CAAC,OAAO,EAChB,YAAY,CAAC,MAAM,CAAC,EACpB,MAAM,CAAC,mBAAmB,CAC3B,CAAC;QACF,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAAE,CAAC;YAChC,OAAO,OAAO,CACZ,uBAAuB,CAAC,IAAI,EAC5B,UAAU,CAAC,cAAc,EAAE,uBAAuB,CAAC,IAAI,CAAC,CACzD,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAuB,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAA4B,EAC5B,OAA4B,EAC5B,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,QAAQ,EAAE;YAChE,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,EAAE;YAAE,OAAO,oBAAoB,CAAC;QAC1D,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,KAAK,CAAC;QAErD,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,sBAAsB,EAAE,MAAM,CAAC,CAAC;QACnE,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAC/D,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAC/D,IACE,iBAAiB,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;YAC/C,iBAAiB,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAC3C,CAAC;YACD,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/C,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;gBACzD,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;aAAM,IACL,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,EACrE,CAAC;YACD,IAAI,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAC7B,YAAY,CACV,OAAO,CAAC,UAAU,EAClB,wBAAwB,EACxB,mBAAmB,CACpB,EACD,wBAAwB,CACzB,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,YAAY,CAC5B,iBAAiB,CAAC,SAAS,EAC3B,gBAAgB,CACjB,CAAC;QACF,IACE,MAAM;YACN,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,QAAU,EAC7D,CAAC;YACD,IAAI,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QACrE,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAC/B,iBAAiB,CAAC,kBAAkB,IAAI,EAAE,CAC3C,CAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,4BAA4B,EAAE,2BAA2B,KAAK,GAAG,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,yBAAyB,CACvC,QAAgC;IAEhC,MAAM,QAAQ,GAAkC;QAC9C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,GAAG,CAAC,QAAQ,CAAC,aAAa,KAAK,SAAS;YACtC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC9C,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1C,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS;YACnC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,KAAK,SAAS;YAC3C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QACxD,KAAK,EAAE;YACL,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS;YACnC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK;SAC5B;KACF,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,+BAA+B,CAC7C,QAAsB,EACtB,UAA+B,EAAE;IAEjC,OAAO,yBAAyB,CAC9B,yBAAyB,CAAC,QAAQ,CAAC,EACnC,OAAO,CACR,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CACrC,OAA2B,EAC3B,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,qBAAqB,CAClC,OAAO,EACP,YAAY,CAAC,MAAM,CAAC,EACpB,MAAM,CAAC,mBAAmB,CAC3B,CAAC;IACF,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAc,EACd,MAAoC;IAEpC,MAAM,QAAQ,GAAG,kBAAkB,CACjC,KAAK,EACL,EAAE,EACF,CAAC,GAAG,oBAAoB,EAAE,GAAG,oBAAoB,CAAC,EAClD,GAAG,EACH,wBAAwB,CACzB,CAAC;IACF,IAAI,QAAQ,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACxC,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,iBAAiB,EAAE,CAAC;QAC/C,IAAI,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACxE,MAAM,WAAW,GACf,QAAQ,CAAC,WAAW,KAAK,SAAS;QAChC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,YAAY,CACvB,QAAQ,CAAC,IAAI,EACb,WAAW,EACX,0BAA0B,CAC3B,CAAC;IACF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,0BAA0B,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,0BAA0B,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,yBAAyB,CACxC,QAAQ,CAAC,QAAQ,EACjB,eAAe,CAChB,CAAC;IACF,MAAM,UAAU,GAAG,YAAY,CAC7B,QAAQ,CAAC,MAAM,EACf,aAAa,EACb,mBAAmB,CACpB,CAAC;IACF,MAAM,aAAa,GAAG,YAAY,CAChC,QAAQ,CAAC,SAAS,EAClB,gBAAgB,EAChB,mBAAmB,CACpB,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAChE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAElD,MAAM,aAAa,GACjB,QAAQ,CAAC,aAAa,KAAK,SAAS;QAClC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IACpE,MAAM,WAAW,GACf,QAAQ,CAAC,WAAW,KAAK,SAAS;QAChC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,iBAAiB,CACnC,QAAQ,CAAC,WAAW,EACpB,kBAAkB,CACnB,CAAC;IACF,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,UAAU,GACd,QAAQ,CAAC,UAAU,KAAK,SAAS;QAC/B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,kBAAkB,GACtB,QAAQ,CAAC,kBAAkB,KAAK,SAAS;QACvC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,0BAA0B,CACxB,QAAQ,CAAC,kBAAkB,EAC3B,UAAU,EACV,MAAM,CACP,CAAC;IAER,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;IACxD,CAAC;IACD,+BAA+B,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAE1E,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,WAAW,EAAE,iBAAiB;QAC9B,SAAS;QACT,QAAQ;QACR,MAAM;QACN,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,aAAa;QACxB,WAAW;QACX,OAAO;QACP,KAAK;QACL,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;QACzD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QACnD,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC;KACpD,CAAC;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,MAAoC;IAC1E,MAAM,MAAM,GAAG,kBAAkB,CAC/B,KAAK,EACL,CAAC,YAAY,EAAE,QAAQ,CAAC,EACxB,EAAE,EACF,aAAa,EACb,iBAAiB,CAClB,CAAC;IACF,OAAO;QACL,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC;QACxE,UAAU,EAAE,gBAAgB,CAC1B,MAAM,CAAC,UAAU,EACjB,2BAA2B,EAC3B,MAAM,CACP;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAc,EACd,MAAoC;IAEpC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,eAAe,CACb,QAAQ,EACR,CAAC,MAAM,EAAE,QAAQ,CAAC,EAClB,eAAe,EACf,kBAAkB,CACnB,CAAC;QACF,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,gBAAgB,CACtB,QAAQ,CAAC,MAAM,EACf,yBAAyB,EACzB,MAAM,CACP;SACF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,eAAe,CACb,QAAQ,EACR,CAAC,MAAM,EAAE,OAAO,CAAC,EACjB,eAAe,EACf,kBAAkB,CACnB,CAAC;QACF,MAAM,KAAK,GAAG,YAAY,CACxB,QAAQ,CAAC,KAAK,EACd,wBAAwB,EACxB,kBAAkB,CACnB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAA0B,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CACtB,IAAgC,EAChC,KAAc,EACd,MAAoC;IAEpC,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,kBAAkB,CAChC,KAAK,EACL,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,EACtC,EAAE,EACF,cAAc,EACd,iBAAiB,CAClB,CAAC;QACF,MAAM,MAAM,GAAqB;YAC/B,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;YAC3C,UAAU,EAAE,gBAAgB,CAC1B,OAAO,CAAC,UAAU,EAClB,4BAA4B,EAC5B,MAAM,CACP;YACD,YAAY,EAAE,yBAAyB,CACrC,OAAO,CAAC,YAAY,EACpB,8BAA8B,EAC9B,iBAAiB,CAClB;SACF,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,kBAAkB,CAChC,KAAK,EACL,CAAC,MAAM,CAAC,EACR,EAAE,EACF,cAAc,EACd,iBAAiB,CAClB,CAAC;QACF,MAAM,MAAM,GAAoB;YAC9B,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;SAC5C,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAChC,KAAK,EACL,CAAC,MAAM,CAAC,EACR,EAAE,EACF,cAAc,EACd,iBAAiB,CAClB,CAAC;IACF,MAAM,MAAM,GAAuB;QACjC,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC;KACvD,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,MAAoC;IACzE,MAAM,KAAK,GAAG,kBAAkB,CAC9B,KAAK,EACL,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,EAC/B,EAAE,EACF,YAAY,EACZ,eAAe,CAChB,CAAC;IACF,IAAI,KAAK,CAAC,SAAS,KAAK,wBAAwB,EAAE,CAAC;QACjD,IAAI,CAAC,eAAe,EAAE,yBAAyB,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CACxB,KAAK,CAAC,KAAK,EACX,qBAAqB,EACrB,eAAe,CAChB,CAAC;IACF,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO;QACL,SAAS,EAAE,wBAAwB;QACnC,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,CAAC;QACnE,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAc,EACd,MAAoC;IAEpC,MAAM,UAAU,GAAG,YAAY,CAC7B,KAAK,EACL,iBAAiB,EACjB,mBAAmB,CACpB,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC3C,IAAI,CAAC,2BAA2B,EAAE,iBAAiB,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,SAAS,GAAG,qBAAqB,CACrC,UAAU,EACV,YAAY,CAAC,MAAM,CAAC,EACpB,MAAM,CAAC,oBAAoB,CAC5B,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,UAAqD,CAAC;AAC/D,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAc,EACd,UAA+D,EAC/D,MAAoC;IAEpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,yBAAyB,EAAE,CAAC;QACpD,IAAI,CAAC,2BAA2B,EAAE,yBAAyB,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,YAAY,CACtB,KAAK,EACL,2BAA2B,KAAK,GAAG,EACnC,mBAAmB,CACpB,CAAC;QACF,IACE,GAAG,CAAC,MAAM,KAAK,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACb,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,EACrC,CAAC;YACD,IAAI,CAAC,mBAAmB,EAAE,2BAA2B,KAAK,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,+BAA+B,CACtC,IAAgC,EAChC,QAAsB,EACtB,WAA+B,EAC/B,WAA+B;IAE/B,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;YAChE,IAAI,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;QACrD,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,IAAI,KAAK,eAAe,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC1D,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAgC,EAChC,MAAc,EACd,SAAiB,EACjB,MAAoC;IAEpC,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IACnE,IAAI,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,QAAU,EAAE,CAAC;QACtD,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAc,EACd,QAAW;IAEX,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,IAAY;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAAC;IAChE,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAC5B,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EACxD,CAAC;QACD,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC9D,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAc,EACd,IAAY,EACZ,MAAoC;IAEpC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,yBAAyB,CAChC,KAAc,EACd,IAAY,EACZ,OAA8B,kBAAkB;IAEhD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CACnB,KAAc,EACd,IAAY,EACZ,OAA8B,iBAAiB;IAE/C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAc,EACd,YAA+B,EAC/B,YAA+B,EAC/B,IAAY,EACZ,IAA2B;IAE3B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CACtB,MAA+B,EAC/B,IAAuB,EACvB,IAAY,EACZ,IAA2B;IAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,IACE,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACxC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CACnB,KAAc,EACd,IAAY,EACZ,IAA2B;IAE3B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,IACE,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAChE,OAAO,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;QAC3E,CAAC,CAAC,EACF,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,IAAY;IAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,CACJ,AADK,EAEL,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EACR,UAAU,EACV,UAAU,EACV,YAAY,GAAG,EAAE,EACjB,IAAI,EACJ,UAAU,EACV,cAAc,EACd,gBAAgB,EACjB,GAAG,KAAK,CAAC;IACV,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,IACE,IAAI,GAAG,IAAI;QACX,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,EAAE;QACV,GAAG,GAAG,CAAC;QACP,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;QAC9B,IAAI,GAAG,EAAE;QACT,MAAM,GAAG,EAAE;QACX,MAAM,GAAG,EAAE,EACX,CAAC;QACD,OAAO,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,WAAW,GAAG,EAAE,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,aAAa;YACX,CAAC,WAAW,GAAG,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,YAAY,GAChB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;QACpD,aAAa,GAAG,MAAM,CAAC;IACzB,MAAM,mBAAmB,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,YAAY,CAAC,GAAG,QAAU,GAAG,mBAAmB,CAAC;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,aAAqB;IAChE,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,kBAAkB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,eAAe,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,eAAe,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,CAAC,GAAG,eAAe,CAAC;IACvC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAa;IAEb,OAAO,CACL,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,eAAe,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CACnC,KAAc,EACd,OAA4B;IAW5B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,qBAAqB,CAClC,KAAK,EACL,YAAY,CAAC,MAAM,CAAC,EACpB,MAAM,CAAC,oBAAoB,CAC5B,CAAC;IACF,OAAO,MAAM,CAAC,EAAE;QACd,CAAC,CAAC,MAAM;QACR,CAAC,CAAC;YACE,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;SACnD,CAAC;AACR,CAAC;AAED,SAAS,aAAa,CACpB,SAAkD;IAElD,MAAM,MAAM,GAAG;QACb,GAAG,4BAA4B;KACY,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAiC,EAAE,CAAC;YACzE,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACvE,MAAM,IAAI,UAAU,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,MAAoC;IACxD,OAAO;QACL,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;QACrD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;QACrD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;KAC9C,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,MAAc;IAChD,OAAO,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,OAAO,CAAI,KAAQ;IAC1B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO,CACd,IAA2B,EAC3B,IAAY;IAEZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CAAI,KAAc;IAC1C,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,IAAI,CAAC,IAA2B,EAAE,IAAY;IACrD,MAAM,IAAI,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,MAAM,IAAI,sBAAsB;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,GAAG,GAAG,sBAAsB,GAAG,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,aAAa,IAAI,MAAM,IAAI,aAAa,IAAI,MAAM;QAAE,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;AACpC,CAAC"}
@@ -0,0 +1,9 @@
1
+ # Protocol v0 structural fixtures
2
+
3
+ These fixtures exercise strict parsing, closed schemas, message-specific
4
+ constraints and canonical binary representations for the Alpha 1 message
5
+ subset.
6
+
7
+ The digest and proof fields are deterministic representation placeholders.
8
+ They are not cryptographic test vectors and do not assert that a payload digest
9
+ or signature verifies. No private key material is included.