@noble/post-quantum 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/hybrid.js CHANGED
@@ -50,7 +50,8 @@
50
50
  *
51
51
  * - GPG:
52
52
  * • Concatenate keys.
53
- * • Combiner: SHA3-256(kemShare || ecdhShare || ciphertext || pubKey || algId || domSep || len(domSep))
53
+ * • Combiner:
54
+ * SHA3-256(kemShare || ecdhShare || ciphertext || pubKey || algId || domSep || len(domSep))
54
55
  *
55
56
  * - TLS:
56
57
  * • Transcript-based derivation (HKDF).
@@ -84,21 +85,31 @@ import { sha256 } from '@noble/hashes/sha2.js';
84
85
  import { sha3_256, shake256 } from '@noble/hashes/sha3.js';
85
86
  import { abytes, ahash, anumber } from '@noble/hashes/utils.js';
86
87
  import { ml_kem1024, ml_kem768 } from "./ml-kem.js";
87
- import { cleanBytes, randomBytes, splitCoder, } from "./utils.js";
88
+ import { cleanBytes, copyBytes, randomBytes, splitCoder, validateSigOpts, validateVerOpts, } from "./utils.js";
88
89
  // Can re-use if decide to signatures support, on other hand getSecretKey is specific and ugly
89
90
  function ecKeygen(curve, allowZeroKey = false) {
90
91
  const lengths = curve.lengths;
91
92
  let keygen = curve.keygen;
92
93
  if (allowZeroKey) {
94
+ // Only the ECDSA/Weierstrass branch uses raw scalar-byte secret keys here. Edwards seeds are
95
+ // hashed/pruned and Montgomery keys are clamped byte strings, so forcing Point.Fn semantics on
96
+ // those curves would change key construction instead of just relaxing scalar range handling.
97
+ if (!('getSharedSecret' in curve && 'sign' in curve && 'verify' in curve))
98
+ throw new Error('allowZeroKey requires a Weierstrass curve');
99
+ // This legacy flag is really "skip the +1 shift" for vector matching, not "accept scalar 0".
100
+ // It swaps seeded Weierstrass keygen from reduction into [1, ORDER) to direct reduction into
101
+ // [0, ORDER), which preserves exact reduced bytes but still leaves scalar 0 invalid.
93
102
  // This is ugly, but we need to return exact results here.
94
103
  const wCurve = curve;
95
104
  const Fn = wCurve.Point.Fn;
96
- if (!Fn)
97
- throw new Error('No Point.Fn');
105
+ // Unlike noble-curves' seeded Weierstrass keygen, this path removes the post-reduction +1.
106
+ // That is enough to match exact reduced-vector bytes, but an all-zero seed still reduces to
107
+ // scalar 0 here and getPublicKey(secretKey) throws instead of "allowing zero".
98
108
  keygen = (seed = randomBytes(lengths.seed)) => {
99
109
  abytes(seed, lengths.seed, 'seed');
100
110
  const seedScalar = Fn.isLE ? bytesToNumberLE(seed) : bytesToNumberBE(seed);
101
- const secretKey = Fn.toBytes(Fn.create(seedScalar)); // Fixes modulo bias, but not zero
111
+ // Reduce directly into [0, ORDER); scalar 0 still stays invalid.
112
+ const secretKey = Fn.toBytes(Fn.create(seedScalar));
102
113
  return { secretKey, publicKey: curve.getPublicKey(secretKey) };
103
114
  };
104
115
  }
@@ -108,6 +119,29 @@ function ecKeygen(curve, allowZeroKey = false) {
108
119
  getPublicKey: (secretKey) => curve.getPublicKey(secretKey),
109
120
  };
110
121
  }
122
+ /**
123
+ * Wraps an ECDH-capable curve as a KEM.
124
+ * Shared secrets stay in the wrapped curve's raw ECDH byte format with no built-in KDF.
125
+ * On SEC 1 / Weierstrass curves, that means the compressed shared-point body without the
126
+ * 1-byte `0x02` / `0x03` prefix.
127
+ * The X25519 path also leaves RFC 7748's optional all-zero shared-secret check to callers.
128
+ * @param curve - Curve with `getSharedSecret`.
129
+ * @param allowZeroKey - Legacy vector-matching toggle for Weierstrass keygen.
130
+ * On Weierstrass curves this removes the usual post-reduction `+1` shift, changing seeded scalar
131
+ * reduction from `[1, ORDER)` to direct reduction into `[0, ORDER)`. It does not make scalar zero
132
+ * valid: an all-zero seed still derives scalar `0` and throws in `curve.getPublicKey(...)`.
133
+ * Only supported on Weierstrass/ECDSA curves.
134
+ * @returns KEM wrapper over the curve.
135
+ * @throws If the curve does not expose `getSharedSecret`. {@link Error}
136
+ * @example
137
+ * Wrap an ECDH-capable curve as a generic KEM.
138
+ * ```ts
139
+ * import { x25519 } from '@noble/curves/ed25519.js';
140
+ * import { ecdhKem } from '@noble/post-quantum/hybrid.js';
141
+ * const kem = ecdhKem(x25519);
142
+ * const publicKeyLen = kem.lengths.publicKey;
143
+ * ```
144
+ */
111
145
  export function ecdhKem(curve, allowZeroKey = false) {
112
146
  const kg = ecKeygen(curve, allowZeroKey);
113
147
  if (!curve.getSharedSecret)
@@ -117,11 +151,23 @@ export function ecdhKem(curve, allowZeroKey = false) {
117
151
  keygen: kg.keygen,
118
152
  getPublicKey: kg.getPublicKey,
119
153
  encapsulate(publicKey, rand = randomBytes(curve.lengths.seed)) {
120
- const ek = this.keygen(rand).secretKey;
121
- const sharedSecret = this.decapsulate(publicKey, ek);
122
- const cipherText = curve.getPublicKey(ek);
123
- cleanBytes(ek);
124
- return { sharedSecret, cipherText };
154
+ // Some curve.keygen(seed) paths reuse the provided seed buffer as secretKey; detach caller
155
+ // randomness first so cleanBytes() only wipes wrapper-owned material.
156
+ const seed = copyBytes(rand);
157
+ let ek = undefined;
158
+ try {
159
+ ek = this.keygen(seed).secretKey;
160
+ const sharedSecret = this.decapsulate(publicKey, ek);
161
+ const cipherText = curve.getPublicKey(ek);
162
+ return { sharedSecret, cipherText };
163
+ }
164
+ finally {
165
+ // Invalid peer public keys can make decapsulation throw; wipe both the detached seed and
166
+ // derived ephemeral secret key even when encapsulation aborts before returning.
167
+ cleanBytes(seed);
168
+ if (ek)
169
+ cleanBytes(ek);
170
+ }
125
171
  },
126
172
  decapsulate(cipherText, secretKey) {
127
173
  const res = curve.getSharedSecret(secretKey, cipherText);
@@ -129,6 +175,27 @@ export function ecdhKem(curve, allowZeroKey = false) {
129
175
  },
130
176
  };
131
177
  }
178
+ /**
179
+ * Wraps a curve signer as a generic `Signer`.
180
+ * Signatures stay in the wrapped curve's native byte encoding.
181
+ * This wrapper does not normalize or document which per-curve signing options are meaningful.
182
+ * @param curve - Curve with `sign` and `verify`.
183
+ * @param allowZeroKey - Legacy vector-matching toggle for Weierstrass keygen.
184
+ * On Weierstrass curves this removes the usual post-reduction `+1` shift, changing seeded scalar
185
+ * reduction from `[1, ORDER)` to direct reduction into `[0, ORDER)`. It does not make scalar zero
186
+ * valid: an all-zero seed still derives scalar `0` and throws in `curve.getPublicKey(...)`.
187
+ * Only supported on Weierstrass/ECDSA curves.
188
+ * @returns Signer wrapper over the curve.
189
+ * @throws If the curve does not expose `sign` and `verify`. {@link Error}
190
+ * @example
191
+ * Wrap a curve signer as a generic signer.
192
+ * ```ts
193
+ * import { ed25519 } from '@noble/curves/ed25519.js';
194
+ * import { ecSigner } from '@noble/post-quantum/hybrid.js';
195
+ * const signer = ecSigner(ed25519);
196
+ * const sigLen = signer.lengths.signature;
197
+ * ```
198
+ */
132
199
  export function ecSigner(curve, allowZeroKey = false) {
133
200
  const kg = ecKeygen(curve, allowZeroKey);
134
201
  if (!curve.sign || !curve.verify)
@@ -137,11 +204,31 @@ export function ecSigner(curve, allowZeroKey = false) {
137
204
  lengths: { ...kg.lengths, signature: curve.lengths.signature, signRand: 0 },
138
205
  keygen: kg.keygen,
139
206
  getPublicKey: kg.getPublicKey,
140
- sign: (message, secretKey) => curve.sign(message, secretKey),
141
- verify: (signature, message, publicKey) => curve.verify(signature, message, publicKey),
207
+ sign: (message, secretKey, opts = {}) => {
208
+ validateSigOpts(opts);
209
+ // This generic wrapper intentionally keeps the Signer contract to message + key only.
210
+ // Backend-specific knobs like ECDSA extraEntropy or Ed25519ctx context cannot be forwarded
211
+ // uniformly through combineSigners(), so callers that need them must use the curve directly.
212
+ if (opts.extraEntropy !== undefined)
213
+ throw new Error('ecSigner does not support extraEntropy; use the underlying curve directly');
214
+ if (opts.context !== undefined)
215
+ throw new Error('ecSigner does not support context; use the underlying curve directly');
216
+ return curve.sign(message, secretKey);
217
+ },
218
+ /** Verify one wrapped curve signature.
219
+ * Returns the wrapped curve's `verify()` result for well-formed inputs. Throws on unsupported
220
+ * generic opts and lets wrapped-curve malformed-input errors escape unchanged.
221
+ */
222
+ verify: (signature, message, publicKey, opts = {}) => {
223
+ validateVerOpts(opts);
224
+ if (opts.context !== undefined)
225
+ throw new Error('ecSigner does not support context; use the underlying curve directly');
226
+ return curve.verify(signature, message, publicKey);
227
+ },
142
228
  };
143
229
  }
144
230
  function splitLengths(lst, name) {
231
+ // Preserve caller order exactly; raw numeric fields still decode as splitCoder() subarray views.
145
232
  return splitCoder(name, ...lst.map((i) => {
146
233
  if (typeof i.lengths[name] !== 'number')
147
234
  throw new Error('wrong length: ' + name);
@@ -149,7 +236,23 @@ function splitLengths(lst, name) {
149
236
  }));
150
237
  }
151
238
  // It is XOF for most cases, but can be more complex!
239
+ /**
240
+ * Adapts an XOF into an `ExpandSeed` callback.
241
+ * The returned callback interprets its second argument as an output byte length passed as `dkLen`.
242
+ * @param xof - Extendable-output hash function.
243
+ * @returns Seed expander using `dkLen`.
244
+ * @example
245
+ * Adapt an XOF into a seed expander.
246
+ * ```ts
247
+ * import { shake256 } from '@noble/hashes/sha3.js';
248
+ * import { expandSeedXof } from '@noble/post-quantum/hybrid.js';
249
+ * const expandSeed = expandSeedXof(shake256);
250
+ * const seed = expandSeed(new Uint8Array([1]), 4);
251
+ * ```
252
+ */
152
253
  export function expandSeedXof(xof) {
254
+ // Forward the caller seed directly: XOFs are expected to treat inputs as read-only, and this
255
+ // adapter only translates the requested byte length into the hash API's `dkLen` option.
153
256
  return (seed, seedLen) => xof(seed, { dkLen: seedLen });
154
257
  }
155
258
  function combineKeys(realSeedLen, // how much bytes expandSeed expects
@@ -162,29 +265,89 @@ expandSeed, ...ck) {
162
265
  anumber(realSeedLen);
163
266
  function expandDecapsulationKey(seed) {
164
267
  abytes(seed, realSeedLen);
165
- const expanded = seedCoder.decode(expandSeed(seed, seedCoder.bytesLen));
166
- const keys = ck.map((i, j) => i.keygen(expanded[j]));
167
- const secretKey = keys.map((i) => i.secretKey);
168
- const publicKey = keys.map((i) => i.publicKey);
169
- return { secretKey, publicKey };
268
+ const expandedRaw = expandSeed(seed, seedCoder.bytesLen);
269
+ // Identity/subarray expanders can hand back caller-owned seed storage. Detach those outputs so
270
+ // later cleanup can wipe the expanded schedule without mutating the caller's root seed bytes.
271
+ const expandedSeed = expandedRaw.buffer === seed.buffer ? copyBytes(expandedRaw) : expandedRaw;
272
+ const expanded = [];
273
+ const keySecret = [];
274
+ const secretKey = [];
275
+ const publicKey = [];
276
+ let ok = false;
277
+ try {
278
+ // seedCoder.decode() returns zero-copy slices into expandedSeed and can throw before child
279
+ // keygen() runs, so keep the raw expanded buffer separate and copy each child seed before any
280
+ // later cleanup wipes the shared backing bytes.
281
+ for (const part of seedCoder.decode(expandedSeed))
282
+ expanded.push(copyBytes(part));
283
+ for (let i = 0; i < ck.length; i++) {
284
+ const keys = ck[i].keygen(expanded[i]);
285
+ keySecret.push(keys.secretKey);
286
+ secretKey.push(copyBytes(keys.secretKey));
287
+ publicKey.push(keys.publicKey);
288
+ }
289
+ ok = true;
290
+ return { secretKey, publicKey };
291
+ }
292
+ finally {
293
+ // Child keygen() can throw after deriving only a prefix of the composite key schedule. Keep
294
+ // the exported copies on success, but wipe all temporary and partially built secret material
295
+ // on either path so failures do not strand derived child seeds in memory.
296
+ cleanBytes(expandedSeed, expanded, keySecret);
297
+ if (!ok)
298
+ cleanBytes(secretKey);
299
+ }
170
300
  }
171
301
  return {
172
302
  info: { lengths: { seed: realSeedLen, publicKey: pkCoder.bytesLen, secretKey: realSeedLen } },
173
303
  getPublicKey(secretKey) {
304
+ // Composite secret keys are root seeds, so public-key derivation reruns key expansion from
305
+ // that seed instead of decoding a packed child-secret-key structure.
174
306
  return this.keygen(secretKey).publicKey;
175
307
  },
176
308
  keygen(seed = randomBytes(realSeedLen)) {
177
309
  const { publicKey: pk, secretKey } = expandDecapsulationKey(seed);
178
- const publicKey = pkCoder.encode(pk);
179
- cleanBytes(pk);
180
- cleanBytes(secretKey);
181
- return { secretKey: seed, publicKey };
310
+ try {
311
+ const publicKey = pkCoder.encode(pk);
312
+ return { secretKey: seed, publicKey };
313
+ }
314
+ finally {
315
+ cleanBytes(pk);
316
+ // The exported secretKey is the caller/root seed itself; child secret keys are internal
317
+ // expansion outputs that are cleaned whether encoding succeeds or throws.
318
+ cleanBytes(secretKey);
319
+ }
182
320
  },
183
321
  expandDecapsulationKey,
184
322
  realSeedLen,
185
323
  };
186
324
  }
187
325
  // This generic function that combines multiple KEMs into single one
326
+ /**
327
+ * Combines multiple KEMs into one composite KEM.
328
+ * @param realSeedLen - Input seed length expected by `expandSeed`.
329
+ * @param realMsgLen - Shared-secret length returned by `combiner`.
330
+ * @param expandSeed - Seed expander used to derive per-KEM seeds.
331
+ * @param combiner - Combines the per-KEM outputs into one shared secret.
332
+ * @param kems - KEM implementations to combine.
333
+ * @returns Composite KEM.
334
+ * @example
335
+ * Combine multiple KEMs into one composite KEM.
336
+ * ```ts
337
+ * import { shake256 } from '@noble/hashes/sha3.js';
338
+ * import { combineKEMS, expandSeedXof } from '@noble/post-quantum/hybrid.js';
339
+ * import { ml_kem768 } from '@noble/post-quantum/ml-kem.js';
340
+ * const hybrid = combineKEMS(
341
+ * 32,
342
+ * 32,
343
+ * expandSeedXof(shake256),
344
+ * (_pk, _ct, sharedSecrets) => sharedSecrets[0],
345
+ * ml_kem768,
346
+ * ml_kem768
347
+ * );
348
+ * const { publicKey } = hybrid.keygen();
349
+ * ```
350
+ */
188
351
  export function combineKEMS(realSeedLen, // how much bytes expandSeed expects
189
352
  realMsgLen, // how much bytes combiner returns
190
353
  expandSeed, combiner, ...kems) {
@@ -207,26 +370,62 @@ expandSeed, combiner, ...kems) {
207
370
  encapsulate(pk, randomness = randomBytes(msgCoder.bytesLen)) {
208
371
  const pks = pkCoder.decode(pk);
209
372
  const rand = msgCoder.decode(randomness);
210
- const enc = kems.map((i, j) => i.encapsulate(pks[j], rand[j]));
211
- const sharedSecret = enc.map((i) => i.sharedSecret);
212
- const cipherText = enc.map((i) => i.cipherText);
213
- const res = {
214
- sharedSecret: combiner(pks, cipherText, sharedSecret),
215
- cipherText: ctCoder.encode(cipherText),
216
- };
217
- cleanBytes(sharedSecret, cipherText);
218
- return res;
373
+ const sharedSecret = [];
374
+ const cipherText = [];
375
+ try {
376
+ for (let i = 0; i < kems.length; i++) {
377
+ const enc = kems[i].encapsulate(pks[i], rand[i]);
378
+ sharedSecret.push(enc.sharedSecret);
379
+ cipherText.push(enc.cipherText);
380
+ }
381
+ return {
382
+ // Detach the combiner result before cleanup: a caller-provided combiner may alias one of
383
+ // the child sharedSecret buffers, and those child buffers are zeroized immediately below.
384
+ sharedSecret: copyBytes(combiner(pks, cipherText, sharedSecret)),
385
+ cipherText: ctCoder.encode(cipherText),
386
+ };
387
+ }
388
+ finally {
389
+ // Child encapsulation or combiner failures can happen after some components already
390
+ // returned secret material; zeroize whatever was produced before propagating the error.
391
+ cleanBytes(sharedSecret, cipherText);
392
+ }
219
393
  },
220
394
  decapsulate(ct, seed) {
221
395
  const cts = ctCoder.decode(ct);
222
396
  const { publicKey, secretKey } = keys.expandDecapsulationKey(seed);
223
397
  const sharedSecret = kems.map((i, j) => i.decapsulate(cts[j], secretKey[j]));
224
- return combiner(publicKey, cts, sharedSecret);
398
+ try {
399
+ // Detach the decapsulation result before cleanup: the combiner may hand back one of the
400
+ // child shared-secret buffers, and those temporary buffers are zeroized below.
401
+ return copyBytes(combiner(publicKey, cts, sharedSecret));
402
+ }
403
+ finally {
404
+ // Decapsulation only needs the expanded child secret keys and child shared secrets for this
405
+ // call; keep the caller/root seed intact, but wipe all derived material even on errors.
406
+ cleanBytes(secretKey, sharedSecret);
407
+ }
225
408
  },
226
409
  };
227
410
  }
228
411
  // There is no specs for this, but can be useful
229
412
  // realSeedLen: how much bytes expandSeed expects.
413
+ /**
414
+ * Combines multiple signers into one composite signer.
415
+ * @param realSeedLen - Input seed length expected by `expandSeed`.
416
+ * @param expandSeed - Seed expander used to derive per-signer seeds.
417
+ * @param signers - Signers to combine.
418
+ * @returns Composite signer.
419
+ * @example
420
+ * Combine multiple signers into one composite signer.
421
+ * ```ts
422
+ * import { shake256 } from '@noble/hashes/sha3.js';
423
+ * import { combineSigners, expandSeedXof } from '@noble/post-quantum/hybrid.js';
424
+ * import { ml_dsa44 } from '@noble/post-quantum/ml-dsa.js';
425
+ * const hybrid = combineSigners(32, expandSeedXof(shake256), ml_dsa44, ml_dsa44);
426
+ * const { publicKey } = hybrid.keygen();
427
+ * ```
428
+ */
230
429
  export function combineSigners(realSeedLen, expandSeed, ...signers) {
231
430
  const keys = combineKeys(realSeedLen, expandSeed, ...signers);
232
431
  const sigCoder = splitLengths(signers, 'signature');
@@ -235,14 +434,34 @@ export function combineSigners(realSeedLen, expandSeed, ...signers) {
235
434
  lengths: { ...keys.info.lengths, signature: sigCoder.bytesLen, signRand: 0 },
236
435
  getPublicKey: keys.getPublicKey,
237
436
  keygen: keys.keygen,
238
- sign(message, seed) {
437
+ sign(message, seed, opts = {}) {
438
+ validateSigOpts(opts);
439
+ // This generic wrapper intentionally keeps the composite signer contract to message + root
440
+ // seed only. Per-signer opts like context or extraEntropy cannot be preserved uniformly
441
+ // across mixed backends, so callers that need them must use the underlying signer directly.
442
+ if (opts.extraEntropy !== undefined)
443
+ throw new Error('combineSigners does not support extraEntropy; use the underlying signer directly');
444
+ if (opts.context !== undefined)
445
+ throw new Error('combineSigners does not support context; use the underlying signer directly');
239
446
  const { secretKey } = keys.expandDecapsulationKey(seed);
240
- // NOTE: we probably can make different hashes for different algorithms
241
- // same way as we do for kem, but not sure if this a good idea.
242
- const sigs = signers.map((i, j) => i.sign(message, secretKey[j]));
243
- return sigCoder.encode(sigs);
447
+ try {
448
+ const sigs = signers.map((i, j) => i.sign(message, secretKey[j]));
449
+ return sigCoder.encode(sigs);
450
+ }
451
+ finally {
452
+ // Composite secret keys are root seeds; the per-signer child secret keys are temporary
453
+ // expansion outputs and must not stay live after the combined signature is produced.
454
+ cleanBytes(secretKey);
455
+ }
244
456
  },
245
- verify: (signature, message, publicKey) => {
457
+ /** Verify one combined signature.
458
+ * Returns `false` when the aggregate signature/publicKey decode succeeds but any child verify
459
+ * check fails. Throws on unsupported generic opts or malformed aggregate encodings.
460
+ */
461
+ verify: (signature, message, publicKey, opts = {}) => {
462
+ validateVerOpts(opts);
463
+ if (opts.context !== undefined)
464
+ throw new Error('combineSigners does not support context; use the underlying signer directly');
246
465
  const pks = pkCoder.decode(publicKey);
247
466
  const sigs = sigCoder.decode(signature);
248
467
  for (let i = 0; i < signers.length; i++) {
@@ -253,13 +472,65 @@ export function combineSigners(realSeedLen, expandSeed, ...signers) {
253
472
  },
254
473
  };
255
474
  }
475
+ /**
476
+ * Builds a QSF hybrid KEM preset from a PQ KEM and an elliptic-curve KEM.
477
+ * The combined shared-secret length follows `kdf.outputLen`; the built-in presets use 32-byte
478
+ * SHA3-256 output, while custom `kdf` choices inherit their own digest size.
479
+ * Its combiner hashes `ss0 || ss1 || ct1 || pk1 || label`, not the full
480
+ * `(c1, c2, ek1, ek2)` example input shape from SP 800-227 equation (15).
481
+ * Labels are encoded with `asciiToBytes()`, so non-ASCII labels are rejected.
482
+ * @param label - Domain-separation label.
483
+ * @param pqc - Post-quantum KEM.
484
+ * @param curveKEM - Classical curve KEM.
485
+ * @param xof - XOF used for seed expansion.
486
+ * @param kdf - Hash used for the final combiner.
487
+ * @returns Hybrid KEM.
488
+ * @example
489
+ * Build a QSF hybrid KEM preset from a PQ KEM and an elliptic-curve KEM.
490
+ * ```ts
491
+ * import { p256 } from '@noble/curves/nist.js';
492
+ * import { sha3_256, shake256 } from '@noble/hashes/sha3.js';
493
+ * import { QSF, ecdhKem } from '@noble/post-quantum/hybrid.js';
494
+ * import { ml_kem768 } from '@noble/post-quantum/ml-kem.js';
495
+ * const kem = QSF('example', ml_kem768, ecdhKem(p256, true), shake256, sha3_256);
496
+ * const publicKeyLen = kem.lengths.publicKey;
497
+ * ```
498
+ */
256
499
  export function QSF(label, pqc, curveKEM, xof, kdf) {
257
500
  ahash(xof);
258
501
  ahash(kdf);
259
- return combineKEMS(32, 32, expandSeedXof(xof), (pk, ct, ss) => kdf(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes(label))), pqc, curveKEM);
502
+ return combineKEMS(32, kdf.outputLen, expandSeedXof(xof), (pk, ct, ss) => kdf(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes(label))), pqc, curveKEM);
260
503
  }
261
- export const QSF_ml_kem768_p256 = QSF('QSF-KEM(ML-KEM-768,P-256)-XOF(SHAKE256)-KDF(SHA3-256)', ml_kem768, ecdhKem(p256, true), shake256, sha3_256);
262
- export const QSF_ml_kem1024_p384 = QSF('QSF-KEM(ML-KEM-1024,P-384)-XOF(SHAKE256)-KDF(SHA3-256)', ml_kem1024, ecdhKem(p384, true), shake256, sha3_256);
504
+ /** QSF preset combining ML-KEM-768 with P-256. */
505
+ export const QSF_ml_kem768_p256 = /* @__PURE__ */ (() => QSF('QSF-KEM(ML-KEM-768,P-256)-XOF(SHAKE256)-KDF(SHA3-256)', ml_kem768, ecdhKem(p256, true), shake256, sha3_256))();
506
+ /** QSF preset combining ML-KEM-1024 with P-384. */
507
+ export const QSF_ml_kem1024_p384 = /* @__PURE__ */ (() => QSF('QSF-KEM(ML-KEM-1024,P-384)-XOF(SHAKE256)-KDF(SHA3-256)', ml_kem1024, ecdhKem(p384, true), shake256, sha3_256))();
508
+ /**
509
+ * Builds the "KitchenSink" hybrid KEM combiner.
510
+ * The current builder always derives a fixed 32-byte output,
511
+ * regardless of the hash's native output size.
512
+ * Its HKDF extract step uses implicit zero salt with IKM
513
+ * `hybrid_prk || ss0 || ss1 || ct0 || pk0 || ct1 || pk1 || label`.
514
+ * Its HKDF expand step fixes `info` to `len || 'shared_secret' || ''`.
515
+ * Labels are encoded with `asciiToBytes()`, so non-ASCII labels are rejected.
516
+ * @param label - Domain-separation label.
517
+ * @param pqc - Post-quantum KEM.
518
+ * @param curveKEM - Classical curve KEM.
519
+ * @param xof - XOF used for seed expansion.
520
+ * @param hash - Hash used for HKDF extraction and expansion.
521
+ * @returns Hybrid KEM.
522
+ * @example
523
+ * Build the "KitchenSink" hybrid KEM combiner.
524
+ * ```ts
525
+ * import { sha256 } from '@noble/hashes/sha2.js';
526
+ * import { shake256 } from '@noble/hashes/sha3.js';
527
+ * import { createKitchenSink, ecdhKem } from '@noble/post-quantum/hybrid.js';
528
+ * import { ml_kem768 } from '@noble/post-quantum/ml-kem.js';
529
+ * import { x25519 } from '@noble/curves/ed25519.js';
530
+ * const kem = createKitchenSink('example', ml_kem768, ecdhKem(x25519), shake256, sha256);
531
+ * const publicKeyLen = kem.lengths.publicKey;
532
+ * ```
533
+ */
263
534
  export function createKitchenSink(label, pqc, curveKEM, xof, hash) {
264
535
  ahash(xof);
265
536
  ahash(hash);
@@ -274,16 +545,35 @@ export function createKitchenSink(label, pqc, curveKEM, xof, hash) {
274
545
  return res;
275
546
  }, pqc, curveKEM);
276
547
  }
277
- const x25519kem = ecdhKem(x25519);
278
- export const KitchenSink_ml_kem768_x25519 = createKitchenSink('KitchenSink-KEM(ML-KEM-768,X25519)-XOF(SHAKE256)-KDF(HKDF-SHA-256)', ml_kem768, x25519kem, shake256, sha256);
548
+ // Internal alias only: this stays exactly `ecdhKem(x25519)`
549
+ // and inherits that wrapper's mutation/oracle behavior.
550
+ const x25519kem = /* @__PURE__ */ ecdhKem(x25519);
551
+ /** KitchenSink preset combining ML-KEM-768 with X25519.
552
+ * Caller randomness splits into 32 ML-KEM coins plus a 32-byte X25519 ephemeral-secret seed.
553
+ */
554
+ export const KitchenSink_ml_kem768_x25519 = /* @__PURE__ */ (() => createKitchenSink('KitchenSink-KEM(ML-KEM-768,X25519)-XOF(SHAKE256)-KDF(HKDF-SHA-256)', ml_kem768, x25519kem, shake256, sha256))();
279
555
  // Always X25519 and ML-KEM - 768, no point to export
556
+ /** X25519 + ML-KEM-768 hybrid preset.
557
+ * Uses the hard-coded domain-separation label `\\.//^\\` and hashes only `ct1 || pk1`
558
+ * from the X25519 side in addition to the two component shared secrets.
559
+ */
280
560
  export const ml_kem768_x25519 = /* @__PURE__ */ (() => combineKEMS(32, 32, expandSeedXof(shake256),
281
561
  // Awesome label, so much escaping hell in a single line.
282
562
  (pk, ct, ss) => sha3_256(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes('\\.//^\\'))), ml_kem768, x25519kem))();
563
+ /**
564
+ * Internal SEC 1-style KEM wrapper for NIST curves.
565
+ * `nseed` is only the rejection-sampling byte budget for deriving one nonzero scalar:
566
+ * current presets use `128` bytes for P-256 and `48` bytes for P-384.
567
+ * `decapsulate()` returns the uncompressed shared point body `x || y` without the `0x04`
568
+ * prefix, not the SEC 1 `x_P`-only primitive output, because current hybrid combiners hash
569
+ * both coordinates.
570
+ */
283
571
  function nistCurveKem(curve, scalarLen, elemLen, nseed) {
284
572
  const Fn = curve.Point.Fn;
285
573
  if (!Fn)
286
574
  throw new Error('no Point.Fn');
575
+ // Scan scalar-sized windows until one decodes to a nonzero scalar in `[1, n-1]`; if every
576
+ // window is zero or out of range, fail instead of silently reducing modulo `n`.
287
577
  function rejectionSampling(seed) {
288
578
  let sk;
289
579
  for (let start = 0, end = scalarLen;; start = end, end += scalarLen) {
@@ -314,11 +604,19 @@ function nistCurveKem(curve, scalarLen, elemLen, nseed) {
314
604
  },
315
605
  encapsulate(publicKey, rand = randomBytes(nseed)) {
316
606
  abytes(rand, nseed, 'rand');
317
- const { secretKey: ek } = rejectionSampling(rand);
318
- const sharedSecret = this.decapsulate(publicKey, ek);
319
- const cipherText = curve.getPublicKey(ek, false);
320
- cleanBytes(ek);
321
- return { sharedSecret, cipherText };
607
+ let ek = undefined;
608
+ try {
609
+ ek = rejectionSampling(rand).secretKey;
610
+ const sharedSecret = this.decapsulate(publicKey, ek);
611
+ const cipherText = curve.getPublicKey(ek, false);
612
+ return { sharedSecret, cipherText };
613
+ }
614
+ finally {
615
+ // Rejection-sampled NIST-curve ephemeral secret keys are temporary encapsulation state and
616
+ // must be wiped even if peer-key validation or shared-secret derivation throws.
617
+ if (ek)
618
+ cleanBytes(ek);
619
+ }
322
620
  },
323
621
  decapsulate(cipherText, secretKey) {
324
622
  const full = curve.getSharedSecret(secretKey, cipherText);
@@ -326,6 +624,14 @@ function nistCurveKem(curve, scalarLen, elemLen, nseed) {
326
624
  },
327
625
  };
328
626
  }
627
+ /**
628
+ * Internal ML-KEM + NIST-curve combiner.
629
+ * `nseed` controls only the curve-side rejection-sampling budget; it is expanded from the
630
+ * 32-byte root seed and is not itself part of the exported secret-key length.
631
+ * The domain-separation `label` is used only in the final `sha3_256` combiner, not in
632
+ * `shake256(seed, { dkLen: 64 + nseed })`,
633
+ * and the combiner hashes `ss0 || ss1 || ct1 || pk1 || label`.
634
+ */
329
635
  function concreteHybridKem(label, mlkem, curve, nseed) {
330
636
  const { secretKey: scalarLen, publicKeyUncompressed: elemLen } = curve.lengths;
331
637
  if (!scalarLen || !elemLen)
@@ -341,14 +647,23 @@ function concreteHybridKem(label, mlkem, curve, nseed) {
341
647
  return concatBytes(mlkemSeed, curveSeed);
342
648
  }, (pk, ct, ss) => sha3_256(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes(label))), mlkem, curveKem);
343
649
  }
650
+ /** P-256 + ML-KEM-768 hybrid preset. */
344
651
  export const ml_kem768_p256 = /* @__PURE__ */ (() => concreteHybridKem('MLKEM768-P256', ml_kem768, p256, 128))();
652
+ /** P-384 + ML-KEM-1024 hybrid preset. */
345
653
  export const ml_kem1024_p384 = /* @__PURE__ */ (() => concreteHybridKem('MLKEM1024-P384', ml_kem1024, p384, 48))();
346
654
  // Legacy aliases
347
- export const XWing = ml_kem768_x25519;
348
- export const MLKEM768X25519 = ml_kem768_x25519;
349
- export const MLKEM768P256 = ml_kem768_p256;
350
- export const MLKEM1024P384 = ml_kem1024_p384;
351
- export const QSFMLKEM768P256 = QSF_ml_kem768_p256;
352
- export const QSFMLKEM1024P384 = QSF_ml_kem1024_p384;
353
- export const KitchenSinkMLKEM768X25519 = KitchenSink_ml_kem768_x25519;
655
+ /** Legacy alias for `ml_kem768_x25519`. */
656
+ export const XWing = /* @__PURE__ */ (() => ml_kem768_x25519)();
657
+ /** Legacy alias for `ml_kem768_x25519`. */
658
+ export const MLKEM768X25519 = /* @__PURE__ */ (() => ml_kem768_x25519)();
659
+ /** Legacy alias for `ml_kem768_p256`. */
660
+ export const MLKEM768P256 = /* @__PURE__ */ (() => ml_kem768_p256)();
661
+ /** Legacy alias for `ml_kem1024_p384`. */
662
+ export const MLKEM1024P384 = /* @__PURE__ */ (() => ml_kem1024_p384)();
663
+ /** Legacy alias for `QSF_ml_kem768_p256`. */
664
+ export const QSFMLKEM768P256 = /* @__PURE__ */ (() => QSF_ml_kem768_p256)();
665
+ /** Legacy alias for `QSF_ml_kem1024_p384`. */
666
+ export const QSFMLKEM1024P384 = /* @__PURE__ */ (() => QSF_ml_kem1024_p384)();
667
+ /** Legacy alias for `KitchenSink_ml_kem768_x25519`. */
668
+ export const KitchenSinkMLKEM768X25519 = /* @__PURE__ */ (() => KitchenSink_ml_kem768_x25519)();
354
669
  //# sourceMappingURL=hybrid.js.map
package/hybrid.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["src/hybrid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["src/hybrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,4EAA4E;AAC5E,OAAO,EAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAuB,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAc,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,WAAW,EACX,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAA6B,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,eAAe,EACf,eAAe,GAIhB,MAAM,YAAY,CAAC;AAMpB,8FAA8F;AAC9F,SAAS,QAAQ,CAAC,KAAe,EAAE,eAAwB,KAAK;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,IAAI,YAAY,EAAE,CAAC;QACjB,6FAA6F;QAC7F,+FAA+F;QAC/F,6FAA6F;QAC7F,IAAI,CAAC,CAAC,iBAAiB,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,6FAA6F;QAC7F,6FAA6F;QAC7F,qFAAqF;QACrF,0DAA0D;QAC1D,MAAM,MAAM,GAAG,KAAc,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,2FAA2F;QAC3F,4FAA4F;QAC5F,+EAA+E;QAC/E,MAAM,GAAG,CAAC,OAAmB,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;YACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAK,EAAE,MAAM,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3E,iEAAiE;YACjE,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,CAAC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;QAC3F,MAAM;QACN,YAAY,EAAE,CAAC,SAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC;KACvE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,OAAO,CAAC,KAAgB,EAAE,eAAwB,KAAK;IACrE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,4BAA4B;IACxF,OAAO;QACL,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;QAClF,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,WAAW,CAAC,SAAqB,EAAE,OAAmB,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACnF,2FAA2F;YAC3F,sEAAsE;YACtE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,EAAE,GAA2B,SAAS,CAAC;YAC3C,IAAI,CAAC;gBACH,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;gBACjC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACrD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAC1C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;YACtC,CAAC;oBAAS,CAAC;gBACT,yFAAyF;gBACzF,gFAAgF;gBAChF,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjB,IAAI,EAAE;oBAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QACD,WAAW,CAAC,UAAsB,EAAE,SAAqB;YACvD,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACzD,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAClE,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAgB,EAAE,eAAwB,KAAK;IACtE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,4BAA4B;IAC9F,OAAO;QACL,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC3E,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;YACtC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,sFAAsF;YACtF,2FAA2F;YAC3F,6FAA6F;YAC7F,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBACjC,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;YACJ,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAC5B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;YAC1F,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;QACD;;;WAGG;QACH,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;YACnD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAC5B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;YAC1F,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,GAAQ,EACR,IAAO;IAEP,iGAAiG;IACjG,OAAO,UAAU,CACf,IAAI,EACJ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACf,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAMD,qDAAqD;AACrD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,6FAA6F;IAC7F,wFAAwF;IACxF,OAAO,CAAC,IAAgB,EAAE,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9E,CAAC;AASD,SAAS,WAAW,CAClB,WAA+B,EAAE,oCAAoC;AACrE,UAAsB,EACtB,GAAG,EAAgB;IAEnB,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC9C,2DAA2D;IAC3D,IAAI,WAAW,KAAK,SAAS;QAAE,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC;IAChE,OAAO,CAAC,WAAW,CAAC,CAAC;IACrB,SAAS,sBAAsB,CAAC,IAAgB;QAC9C,MAAM,CAAC,IAAI,EAAE,WAAY,CAAC,CAAC;QAC3B,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzD,+FAA+F;QAC/F,8FAA8F;QAC9F,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAC/F,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAClC,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,IAAI,EAAE,GAAG,KAAK,CAAC;QACf,IAAI,CAAC;YACH,2FAA2F;YAC3F,8FAA8F;YAC9F,gDAAgD;YAChD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAClF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/B,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC1C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;YACD,EAAE,GAAG,IAAI,CAAC;YACV,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,4FAA4F;YAC5F,6FAA6F;YAC7F,0EAA0E;YAC1E,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,EAAE;gBAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE;QAC7F,YAAY,CAAC,SAAqB;YAChC,2FAA2F;YAC3F,qEAAqE;YACrE,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;QAC1C,CAAC;QACD,MAAM,CAAC,OAAmB,WAAW,CAAC,WAAW,CAAC;YAChD,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,EAAE,CAAC,CAAC;gBACf,wFAAwF;gBACxF,0EAA0E;gBAC1E,UAAU,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,sBAAsB;QACtB,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,WAAW,CACzB,WAA+B,EAAE,oCAAoC;AACrE,UAA8B,EAAE,kCAAkC;AAClE,UAAsB,EACtB,QAAkB,EAClB,GAAG,IAAW;IAEd,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,UAAU,KAAK,SAAS;QAAE,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC7D,OAAO,CAAC,UAAU,CAAC,CAAC;IACpB,OAAO;QACL,OAAO,EAAE;YACP,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;YACpB,GAAG,EAAE,UAAU;YACf,OAAO,EAAE,QAAQ,CAAC,QAAQ;YAC1B,UAAU,EAAE,OAAO,CAAC,QAAQ;SAC7B;QACD,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,CAAC,EAAc,EAAE,aAAyB,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjF,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,YAAY,GAAiB,EAAE,CAAC;YACtC,MAAM,UAAU,GAAiB,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjD,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBACpC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;gBACD,OAAO;oBACL,yFAAyF;oBACzF,0FAA0F;oBAC1F,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;oBAChE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;iBACvC,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,oFAAoF;gBACpF,wFAAwF;gBACxF,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,WAAW,CAAC,EAAc,EAAE,IAAgB;YAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC;gBACH,wFAAwF;gBACxF,+EAA+E;gBAC/E,OAAO,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;YAC3D,CAAC;oBAAS,CAAC;gBACT,4FAA4F;gBAC5F,wFAAwF;gBACxF,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AACD,gDAAgD;AAChD,kDAAkD;AAClD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAC5B,WAA+B,EAC/B,UAAsB,EACtB,GAAG,OAAiB;IAEpB,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACnD,OAAO;QACL,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC5E,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE;YAC3B,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,2FAA2F;YAC3F,wFAAwF;YACxF,4FAA4F;YAC5F,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBACjC,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;YACJ,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAC5B,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;YACJ,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;oBAAS,CAAC;gBACT,uFAAuF;gBACvF,qFAAqF;gBACrF,UAAU,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD;;;WAGG;QACH,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;YACnD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAC5B,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;YACJ,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAE,GAAU;IAC9E,KAAK,CAAC,GAAG,CAAC,CAAC;IACX,KAAK,CAAC,GAAG,CAAC,CAAC;IACX,OAAO,WAAW,CAChB,EAAE,EACF,GAAG,CAAC,SAAS,EACb,aAAa,CAAC,GAAG,CAAC,EAClB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EACjF,GAAG,EACH,QAAQ,CACT,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAC3D,GAAG,CACD,uDAAuD,EACvD,SAAS,EACT,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EACnB,QAAQ,EACR,QAAQ,CACT,CAAC,EAAE,CAAC;AACP,mDAAmD;AACnD,MAAM,CAAC,MAAM,mBAAmB,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAC5D,GAAG,CACD,wDAAwD,EACxD,UAAU,EACV,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EACnB,QAAQ,EACR,QAAQ,CACT,CAAC,EAAE,CAAC;AAEP;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,GAAQ,EACR,QAAa,EACb,GAAQ,EACR,IAAW;IAEX,KAAK,CAAC,GAAG,CAAC,CAAC;IACX,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,WAAW,CAChB,EAAE,EACF,EAAE,EACF,aAAa,CAAC,GAAG,CAAC,EAClB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,WAAW,CACtB,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,EACvB,YAAY,CAAC,eAAe,CAAC,EAC7B,YAAY,CAAC,EAAE,CAAC,CACjB,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,OAAO,GAAG,CAAC;IACb,CAAC,EACD,GAAG,EACH,QAAQ,CACT,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,wDAAwD;AACxD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAClD;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CACrE,iBAAiB,CACf,oEAAoE,EACpE,SAAS,EACT,SAAS,EACT,QAAQ,EACR,MAAM,CACP,CAAC,EAAE,CAAC;AAEP,qDAAqD;AACrD;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CACzD,WAAW,CACT,EAAE,EACF,EAAE,EACF,aAAa,CAAC,QAAQ,CAAC;AACvB,yDAAyD;AACzD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,EAC3F,SAAS,EACT,SAAS,CACV,CAAC,EAAE,CAAC;AAEP;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,KAAY,EAAE,SAAiB,EAAE,OAAe,EAAE,KAAa;IACnF,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,0FAA0F;IAC1F,gFAAgF;IAChF,SAAS,iBAAiB,CAAC,IAAgB;QACzC,IAAI,EAAU,CAAC;QACf,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,GAAI,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;YACrE,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACpE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YACnD,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;gBAAE,MAAM;QAChC,CAAC;QACD,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAClC,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,KAAK;YACV,UAAU,EAAE,OAAO;SACpB;QACD,MAAM,CAAC,OAAmB,WAAW,CAAC,KAAK,CAAC;YAC1C,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,YAAY,CAAC,SAAqB;YAChC,OAAO,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,WAAW,CAAC,SAAqB,EAAE,OAAmB,WAAW,CAAC,KAAK,CAAC;YACtE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5B,IAAI,EAAE,GAA2B,SAAS,CAAC;YAC3C,IAAI,CAAC;gBACH,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;gBACvC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACrD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACjD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;YACtC,CAAC;oBAAS,CAAC;gBACT,2FAA2F;gBAC3F,gFAAgF;gBAChF,IAAI,EAAE;oBAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QACD,WAAW,CAAC,UAAsB,EAAE,SAAqB;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAU,EAAE,KAAY,EAAE,KAAa;IAC/E,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/E,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,MAAM,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;IAE1C,OAAO,WAAW,CAChB,EAAE,EACF,EAAE,EACF,CAAC,IAAgB,EAAE,EAAE;QACnB,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAChE,OAAO,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC,EACD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EACtF,KAAK,EACL,QAAQ,CACT,CAAC;AACJ,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CACvD,iBAAiB,CAAC,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AAE9D,yCAAyC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CACxD,iBAAiB,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AAE/D,iBAAiB;AACjB,2CAA2C;AAC3C,MAAM,CAAC,MAAM,KAAK,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;AACrE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;AAC9E,yCAAyC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;AAC1E,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;AAC5E,6CAA6C;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;AACjF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC;AACnF,uDAAuD;AACvD,MAAM,CAAC,MAAM,yBAAyB,GAAQ,eAAe,CAAC,CAAC,GAAG,EAAE,CAClE,4BAA4B,CAAC,EAAE,CAAC"}