@usearete/automations 0.0.0-stage → 0.44.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.
package/dist/privy.js ADDED
@@ -0,0 +1,614 @@
1
+ import '@usearete/sdk';
2
+ import { base64, base58 } from '@scure/base';
3
+
4
+ function encodeBase58(bytes) {
5
+ return base58.encode(bytes);
6
+ }
7
+ /** The bytes of a padded base64 string, or `null` when it is not base64. */
8
+ function decodeBase64(text) {
9
+ try {
10
+ return base64.decode(text);
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+
17
+ /**
18
+ * Instructions that hand control of the signer's funds to someone else
19
+ * without moving a balance.
20
+ *
21
+ * The policy's caps measure balance changes, and some instructions change no
22
+ * balance yet give the funds away: a token delegation (`approve`), a new
23
+ * owner or authority (`setAuthority`, System `assign`), or lamports leaving
24
+ * an account the signer controls that is not the signer's own (a nonce or
25
+ * stake withdrawal). This module names those instructions in the System, SPL
26
+ * Token, Token-2022, upgradeable loader and stake programs when the signer
27
+ * takes part in them (signs, or is one of their accounts).
28
+ *
29
+ * Top-level instructions are read from the wire bytes. Inner (CPI)
30
+ * instructions are read from a simulation when the RPC returns them.
31
+ *
32
+ * A token account closed to an account other than the signer is not refused;
33
+ * its lamports count as SOL leaving the signer.
34
+ */
35
+ /** Programs that own SPL token accounts. */
36
+ const TOKEN_PROGRAMS = [
37
+ 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
38
+ 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',
39
+ ];
40
+ const SYSTEM_PROGRAM = '11111111111111111111111111111111';
41
+ const UPGRADEABLE_LOADER = 'BPFLoaderUpgradeab1e11111111111111111111111';
42
+ const STAKE_PROGRAM = 'Stake11111111111111111111111111111111111111';
43
+ /** Wrapped SOL mints (SPL Token and Token-2022). */
44
+ const NATIVE_MINTS = [
45
+ 'So11111111111111111111111111111111111111112',
46
+ '9pan9bMn5HatX4EJdBwg9VgCa7Uz5HL8N1m5D3NdXejP',
47
+ ];
48
+ function isTokenProgram(program) {
49
+ return TOKEN_PROGRAMS.includes(program);
50
+ }
51
+ const TOKEN_NAMES = {
52
+ 0: 'initializeMint',
53
+ 1: 'initializeAccount',
54
+ 2: 'initializeMultisig',
55
+ 3: 'transfer',
56
+ 4: 'approve',
57
+ 5: 'revoke',
58
+ 6: 'setAuthority',
59
+ 7: 'mintTo',
60
+ 8: 'burn',
61
+ 9: 'closeAccount',
62
+ 10: 'freezeAccount',
63
+ 11: 'thawAccount',
64
+ 12: 'transferChecked',
65
+ 13: 'approveChecked',
66
+ 14: 'mintToChecked',
67
+ 15: 'burnChecked',
68
+ 16: 'initializeAccount2',
69
+ 17: 'syncNative',
70
+ 18: 'initializeAccount3',
71
+ 19: 'initializeMultisig2',
72
+ 20: 'initializeMint2',
73
+ 21: 'getAccountDataSize',
74
+ 22: 'initializeImmutableOwner',
75
+ 23: 'amountToUiAmount',
76
+ 24: 'uiAmountToAmount',
77
+ 25: 'initializeMintCloseAuthority',
78
+ 29: 'reallocate',
79
+ 31: 'createNativeMint',
80
+ 38: 'withdrawExcessLamports',
81
+ };
82
+ const SYSTEM_NAMES = [
83
+ 'createAccount',
84
+ 'assign',
85
+ 'transfer',
86
+ 'createAccountWithSeed',
87
+ 'advanceNonce',
88
+ 'withdrawFromNonce',
89
+ 'initializeNonce',
90
+ 'authorizeNonce',
91
+ 'allocate',
92
+ 'allocateWithSeed',
93
+ 'assignWithSeed',
94
+ 'transferWithSeed',
95
+ 'upgradeNonce',
96
+ ];
97
+ const STAKE_NAMES = [
98
+ 'initialize',
99
+ 'authorize',
100
+ 'delegate',
101
+ 'split',
102
+ 'withdraw',
103
+ 'deactivate',
104
+ 'setLockup',
105
+ 'merge',
106
+ 'authorizeWithSeed',
107
+ 'initializeChecked',
108
+ 'authorizeChecked',
109
+ 'authorizeCheckedWithSeed',
110
+ 'setLockupChecked',
111
+ 'getMinimumDelegation',
112
+ 'deactivateDelinquent',
113
+ 'redelegate',
114
+ ];
115
+ function tokenName(data) {
116
+ const tag = data[0];
117
+ if (tag === undefined)
118
+ return 'emptyInstruction';
119
+ if (tag === 26 && data[1] === 1)
120
+ return 'transferCheckedWithFee';
121
+ return TOKEN_NAMES[tag] ?? `tokenInstruction${tag}`;
122
+ }
123
+ function u32Tag(data) {
124
+ if (data.length < 4)
125
+ return undefined;
126
+ return (data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24)) >>> 0;
127
+ }
128
+ function taggedName(data, names, fallback) {
129
+ const tag = u32Tag(data);
130
+ if (tag === undefined)
131
+ return 'emptyInstruction';
132
+ return names[tag] ?? `${fallback}${tag}`;
133
+ }
134
+ /** The instruction's name, for the programs this module checks. */
135
+ function instructionName(program, data) {
136
+ if (isTokenProgram(program))
137
+ return tokenName(data);
138
+ if (program === SYSTEM_PROGRAM)
139
+ return taggedName(data, SYSTEM_NAMES, 'systemInstruction');
140
+ if (program === STAKE_PROGRAM)
141
+ return taggedName(data, STAKE_NAMES, 'stakeInstruction');
142
+ if (program === UPGRADEABLE_LOADER) {
143
+ const tag = u32Tag(data);
144
+ return tag === undefined ? 'emptyInstruction' : `upgradeableLoaderInstruction${tag}`;
145
+ }
146
+ return null;
147
+ }
148
+
149
+ /**
150
+ * Consent: what a user signs to let automations run steps for their wallet.
151
+ *
152
+ * The proof is a human-readable, domain-bound message in the style of
153
+ * Sign-In-With-Solana. It is built from the grant's fields, so the backend
154
+ * rebuilds it from the fields it is given and checks the wallet's signature
155
+ * over that, rather than parsing a message. Raising a limit or changing a
156
+ * setting needs a new signature; revoking does not.
157
+ *
158
+ * The signature is an accountability and anti-bug record. It does not
159
+ * protect against a compromised backend; the wallet provider's policy and
160
+ * the protocol's on-chain rules do.
161
+ */
162
+ /** The asset key for SOL (wrapped SOL included), in lamports. */
163
+ const SOL = 'SOL';
164
+
165
+ class TransactionDecodeError extends Error {
166
+ constructor(message) {
167
+ super(message);
168
+ this.name = 'TransactionDecodeError';
169
+ }
170
+ }
171
+ /** The version byte of a v1 transaction, which leads its wire bytes. */
172
+ const V1_PREFIX = 0x81;
173
+ /** Configuration mask bits a v1 message may set; each adds one 4-byte value. */
174
+ const V1_KNOWN_CONFIG_BITS = 0b11111;
175
+ class Reader {
176
+ bytes;
177
+ at;
178
+ constructor(bytes, at = 0) {
179
+ this.bytes = bytes;
180
+ this.at = at;
181
+ }
182
+ compactU16() {
183
+ let value = 0;
184
+ for (let index = 0; index < 3; index++) {
185
+ const byte = this.bytes[this.at];
186
+ if (byte === undefined)
187
+ throw new TransactionDecodeError('truncated transaction');
188
+ this.at += 1;
189
+ value |= (byte & 0x7f) << (7 * index);
190
+ if ((byte & 0x80) === 0)
191
+ return value;
192
+ }
193
+ throw new TransactionDecodeError('invalid compact-u16 length');
194
+ }
195
+ take(length) {
196
+ if (this.at + length > this.bytes.length) {
197
+ throw new TransactionDecodeError('truncated transaction');
198
+ }
199
+ const slice = this.bytes.subarray(this.at, this.at + length);
200
+ this.at += length;
201
+ return slice;
202
+ }
203
+ byte() {
204
+ return this.take(1)[0];
205
+ }
206
+ }
207
+ function writableIndexes(keyCount, required, readonlySigned, readonlyUnsigned) {
208
+ if (required > keyCount || readonlySigned > required || readonlyUnsigned > keyCount - required) {
209
+ throw new TransactionDecodeError('invalid message header');
210
+ }
211
+ const out = [];
212
+ for (let index = 0; index < keyCount; index++) {
213
+ const writable = index < required ? index < required - readonlySigned : index < keyCount - readonlyUnsigned;
214
+ if (writable)
215
+ out.push(index);
216
+ }
217
+ return out;
218
+ }
219
+ /** Decode a legacy, v0 or v1 wire transaction. */
220
+ function decodeTransaction(bytes) {
221
+ if (bytes[0] === V1_PREFIX)
222
+ return decodeV1(bytes);
223
+ const reader = new Reader(bytes);
224
+ const signatureCount = reader.compactU16();
225
+ const signatureOffset = reader.at;
226
+ const signatures = [];
227
+ for (let index = 0; index < signatureCount; index++) {
228
+ signatures.push(reader.take(64));
229
+ }
230
+ const messageStart = reader.at;
231
+ const first = bytes[reader.at];
232
+ if (first === undefined)
233
+ throw new TransactionDecodeError('truncated message');
234
+ let version = null;
235
+ if ((first & 0x80) !== 0) {
236
+ reader.at += 1;
237
+ if ((first & 0x7f) !== 0)
238
+ throw new TransactionDecodeError('unsupported transaction version');
239
+ version = 0;
240
+ }
241
+ const header = reader.take(3);
242
+ const [required, readonlySigned, readonlyUnsigned] = [header[0], header[1], header[2]];
243
+ const keyCount = reader.compactU16();
244
+ const staticKeys = [];
245
+ for (let index = 0; index < keyCount; index++) {
246
+ staticKeys.push(encodeBase58(reader.take(32)));
247
+ }
248
+ const writableStatic = writableIndexes(keyCount, required, readonlySigned, readonlyUnsigned);
249
+ reader.take(32); // recent blockhash
250
+ const instructionCount = reader.compactU16();
251
+ const instructionPrograms = [];
252
+ const instructions = [];
253
+ for (let index = 0; index < instructionCount; index++) {
254
+ const programIndex = reader.byte();
255
+ const accounts = reader.take(reader.compactU16());
256
+ const data = reader.take(reader.compactU16());
257
+ instructions.push({ programIndex, accounts: [...accounts], data: data.slice() });
258
+ const program = staticKeys[programIndex];
259
+ if (program === undefined) {
260
+ throw new TransactionDecodeError("an instruction's program is not a static key");
261
+ }
262
+ instructionPrograms.push(program);
263
+ }
264
+ const lookups = [];
265
+ if (version !== null) {
266
+ const count = reader.compactU16();
267
+ for (let index = 0; index < count; index++) {
268
+ const table = encodeBase58(reader.take(32));
269
+ const writable = [...reader.take(reader.compactU16())];
270
+ const readonly = [...reader.take(reader.compactU16())];
271
+ lookups.push({ table, writable, readonly });
272
+ }
273
+ }
274
+ return {
275
+ version,
276
+ signatures,
277
+ signatureOffset,
278
+ message: { start: messageStart, end: bytes.length },
279
+ requiredSignatures: required,
280
+ staticKeys,
281
+ writableStatic,
282
+ instructionPrograms,
283
+ instructions,
284
+ lookups,
285
+ };
286
+ }
287
+ /** A v1 transaction: the version byte and message, then one signature per required signer. */
288
+ function decodeV1(bytes) {
289
+ const reader = new Reader(bytes, 1);
290
+ const header = reader.take(3);
291
+ const [required, readonlySigned, readonlyUnsigned] = [header[0], header[1], header[2]];
292
+ const maskBytes = reader.take(4);
293
+ const mask = (maskBytes[0] | (maskBytes[1] << 8) | (maskBytes[2] << 16) | (maskBytes[3] << 24)) >>> 0;
294
+ if ((mask & ~V1_KNOWN_CONFIG_BITS) >>> 0 !== 0) {
295
+ throw new TransactionDecodeError('unsupported v1 transaction configuration');
296
+ }
297
+ reader.take(32); // lifetime specifier
298
+ const instructionCount = reader.byte();
299
+ const keyCount = reader.byte();
300
+ const staticKeys = [];
301
+ for (let index = 0; index < keyCount; index++) {
302
+ staticKeys.push(encodeBase58(reader.take(32)));
303
+ }
304
+ reader.take(popcount(mask) * 4);
305
+ const headers = reader.take(instructionCount * 4).slice();
306
+ const instructionPrograms = [];
307
+ const instructions = [];
308
+ for (let offset = 0; offset < headers.length; offset += 4) {
309
+ const programIndex = headers[offset];
310
+ const accountCount = headers[offset + 1];
311
+ const dataLength = headers[offset + 2] | (headers[offset + 3] << 8);
312
+ const accounts = reader.take(accountCount);
313
+ const data = reader.take(dataLength);
314
+ instructions.push({ programIndex, accounts: [...accounts], data: data.slice() });
315
+ const program = staticKeys[programIndex];
316
+ if (program === undefined) {
317
+ throw new TransactionDecodeError("an instruction's program is not an address");
318
+ }
319
+ instructionPrograms.push(program);
320
+ }
321
+ const messageEnd = reader.at;
322
+ const signatures = [];
323
+ for (let index = 0; index < required; index++) {
324
+ signatures.push(reader.take(64));
325
+ }
326
+ if (reader.at !== bytes.length) {
327
+ throw new TransactionDecodeError('trailing bytes after the transaction');
328
+ }
329
+ return {
330
+ version: 1,
331
+ signatures,
332
+ signatureOffset: messageEnd,
333
+ message: { start: 0, end: messageEnd },
334
+ requiredSignatures: required,
335
+ staticKeys,
336
+ writableStatic: writableIndexes(keyCount, required, readonlySigned, readonlyUnsigned),
337
+ instructionPrograms,
338
+ instructions,
339
+ lookups: [],
340
+ };
341
+ }
342
+ function popcount(value) {
343
+ let count = 0;
344
+ for (let bits = value >>> 0; bits !== 0; bits >>>= 1)
345
+ count += bits & 1;
346
+ return count;
347
+ }
348
+
349
+ /**
350
+ * What a signer may sign for a user: the static policy.
351
+ *
352
+ * The rules, their names and the refusal shape match the Arete MCP server's
353
+ * local signer, and both implementations run the shared vectors in
354
+ * `test-vectors/signer-policy/`. The caps hold per transaction, measured by
355
+ * simulating the exact prepared bytes. Wrapped SOL counts against
356
+ * `maxSolPerTransaction`, as do the lamports of a token account closed to
357
+ * someone else. Instructions that hand control of the signer's funds to
358
+ * someone else (token approvals, authority changes, System assignments) are
359
+ * always refused, and so is any transaction whose effect on the signer
360
+ * could not be simulated.
361
+ */
362
+ /**
363
+ * Programs the transaction compiler adds around a step's own instructions
364
+ * (compute budget, memo, fee transfers, token accounts and wrapped SOL).
365
+ * They are always allowed; what they move is bounded by the SOL and token
366
+ * caps.
367
+ */
368
+ const RUNTIME_PROGRAMS = [
369
+ 'ComputeBudget111111111111111111111111111111',
370
+ 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr',
371
+ 'Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo',
372
+ '11111111111111111111111111111111',
373
+ 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
374
+ 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
375
+ 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',
376
+ ];
377
+
378
+ /**
379
+ * Thrown by a signer that declines to sign, for example because the wallet
380
+ * provider's own policy refused the transaction. The job ends `refused`
381
+ * with this rule instead of being retried.
382
+ */
383
+ const REFUSAL_BRAND = Symbol.for('@usearete/automations/SignerRefusal');
384
+ class SignerRefusal extends Error {
385
+ rule;
386
+ /** Recognised across entry points: each bundle has its own copy of this class. */
387
+ [REFUSAL_BRAND] = true;
388
+ constructor(message, rule = 'provider_policy') {
389
+ super(message);
390
+ this.name = 'SignerRefusal';
391
+ this.rule = rule;
392
+ }
393
+ }
394
+
395
+ /**
396
+ * A signer over Privy server wallets, and the Privy policy that bounds it.
397
+ *
398
+ * The signer asks Privy to sign (never to sign and send) each prepared
399
+ * transaction, authorized by your app's authorization key. The runtime
400
+ * checks the returned bytes against the intent, as for any signer.
401
+ *
402
+ * The provider policy is the bound that holds if the backend running
403
+ * automations is compromised, because Privy enforces it in its enclave.
404
+ * Privy's Solana policies see top-level instructions only, so they bound
405
+ * which programs a wallet may call and when, and the amounts of direct
406
+ * transfers, but not what a protocol program moves by CPI.
407
+ * `privyPolicyFor` returns the rules it could not express alongside the
408
+ * policy; see docs/privy-policy-expressiveness.md.
409
+ */
410
+ /**
411
+ * The System and Token instructions a policy from `privyPolicyFor` allows.
412
+ * Privy's Solana policies cannot express the others (for example Token
413
+ * `syncNative`, which wrapping SOL needs), so its default deny refuses them.
414
+ */
415
+ const PRIVY_ALLOWED_INSTRUCTIONS = {
416
+ system: ['transfer'],
417
+ token: ['transferChecked', 'closeAccount', 'initializeAccount3'],
418
+ };
419
+ /** The first top-level instruction a `privyPolicyFor` policy would refuse, or `null`. */
420
+ function unsupportedInstruction(transactionBase64) {
421
+ const bytes = decodeBase64(transactionBase64);
422
+ if (!bytes)
423
+ return null;
424
+ const decoded = decodeTransaction(bytes);
425
+ for (const instruction of decoded.instructions) {
426
+ const program = decoded.staticKeys[instruction.programIndex];
427
+ if (program === undefined)
428
+ continue;
429
+ const isSystem = program === SYSTEM_PROGRAM;
430
+ const isToken = TOKEN_PROGRAMS.includes(program);
431
+ if (!isSystem && !isToken)
432
+ continue;
433
+ const name = instructionName(program, instruction.data) ?? 'unknown';
434
+ const allowed = PRIVY_ALLOWED_INSTRUCTIONS[isSystem ? 'system' : 'token'];
435
+ if (!allowed.includes(name))
436
+ return `${isSystem ? 'System' : 'Token'} \`${name}\``;
437
+ }
438
+ return null;
439
+ }
440
+ /** Whether an error from Privy is its policy refusing, rather than a fault to retry. */
441
+ function isPolicyRefusal(error) {
442
+ const status = error?.status;
443
+ const message = String(error?.message ?? '');
444
+ return status === 403 || /polic(y|ies)/i.test(message);
445
+ }
446
+ /** A {@link ProtocolSigner} over Privy server wallets. */
447
+ function privySigner(options) {
448
+ const { privy, walletIdFor, authorizationPrivateKey } = options;
449
+ if (!authorizationPrivateKey)
450
+ throw new TypeError('privySigner needs an authorization private key');
451
+ const walletId = async (wallet) => {
452
+ const id = await walletIdFor(wallet);
453
+ if (!id)
454
+ throw new SignerRefusal(`no Privy server access to ${wallet}`, 'signer_unavailable');
455
+ return id;
456
+ };
457
+ return {
458
+ kind: 'privy',
459
+ supportedTransactionFormats: options.transactionFormats ?? ['v0'],
460
+ async canSign(wallet) {
461
+ return (await walletIdFor(wallet)) !== null;
462
+ },
463
+ async delegationStatus(wallet) {
464
+ const id = await walletIdFor(wallet);
465
+ if (!id)
466
+ return { delegated: false, providerPolicy: false, detail: 'no Privy wallet with server access' };
467
+ const get = privy.wallets().get;
468
+ if (!get)
469
+ return { delegated: true, providerPolicy: false, detail: 'the Privy client cannot read wallet policies' };
470
+ const details = await get.call(privy.wallets(), id);
471
+ return { delegated: true, providerPolicy: (details.policy_ids?.length ?? 0) > 0 };
472
+ },
473
+ async signTransactions({ wallet, transactions }) {
474
+ if (options.refuseUnsupported !== false) {
475
+ for (const transaction of transactions) {
476
+ const unsupported = unsupportedInstruction(transaction.transactionBase64);
477
+ if (unsupported) {
478
+ throw new SignerRefusal(`transaction ${transaction.index} has a top-level ${unsupported} instruction, which Privy policies cannot allow; this step cannot be signed through Privy`);
479
+ }
480
+ }
481
+ }
482
+ const id = await walletId(wallet);
483
+ const signed = [];
484
+ for (const transaction of transactions) {
485
+ let result;
486
+ try {
487
+ result = await privy.wallets().solana().signTransaction(id, {
488
+ transaction: transaction.transactionBase64,
489
+ authorization_context: { authorization_private_keys: [authorizationPrivateKey] },
490
+ });
491
+ }
492
+ catch (error) {
493
+ if (isPolicyRefusal(error)) {
494
+ throw new SignerRefusal(`Privy refused to sign transaction ${transaction.index}: ${String(error.message)}`);
495
+ }
496
+ throw error;
497
+ }
498
+ const bytes = result.signedTransaction ?? result.signed_transaction;
499
+ if (typeof bytes !== 'string')
500
+ throw new Error('Privy returned no signed transaction');
501
+ signed.push(bytes);
502
+ }
503
+ return signed;
504
+ },
505
+ };
506
+ }
507
+ const CHECKED_BY_INSTRUCTION = new Set([SYSTEM_PROGRAM, ...TOKEN_PROGRAMS]);
508
+ /** The most values Privy's `in` operator accepts. */
509
+ const PRIVY_IN_LIMIT = 100;
510
+ function minimum(...values) {
511
+ return values.reduce((low, value) => (value === undefined ? low : low === undefined || value < low ? value : low), undefined);
512
+ }
513
+ /**
514
+ * The Privy policy for a wallet's consent under a signing policy, and the
515
+ * rules Privy cannot enforce (which the runtime still enforces, but which a
516
+ * compromised backend could skip).
517
+ *
518
+ * Every rule is for `signTransaction` only and holds until the consent
519
+ * expires. Programs from `policy.programs` (plus compute budget, memo and
520
+ * associated token account programs) are allowed. System transfers and
521
+ * token `TransferChecked` are allowed up to the smaller of the policy's and
522
+ * the consent's per-run caps, per instruction (wrapped SOL up to the SOL
523
+ * cap, as it counts as SOL); token accounts may be
524
+ * closed only to the wallet itself. Everything else is denied, including
525
+ * key export.
526
+ */
527
+ function privyPolicyFor(policy, consent, options = {}) {
528
+ if (policy.programs === null) {
529
+ throw new TypeError('privyPolicyFor needs a programs allow-list: without one, Privy would have to allow every program');
530
+ }
531
+ const expires = String(Math.floor(consent.expiresAt / 1000));
532
+ const until = {
533
+ field_source: 'system',
534
+ field: 'current_unix_timestamp',
535
+ operator: 'lt',
536
+ value: expires,
537
+ };
538
+ const rule = (name, conditions) => ({
539
+ name,
540
+ method: 'signTransaction',
541
+ conditions: [...conditions, until],
542
+ action: 'ALLOW',
543
+ });
544
+ const programs = [...new Set([...RUNTIME_PROGRAMS, ...policy.programs])].filter((program) => !CHECKED_BY_INSTRUCTION.has(program));
545
+ const perRun = consent.limits.perExecution;
546
+ // A consent without a SOL limit lets no SOL leave, as the consent check reads it.
547
+ const solCap = minimum(policy.maxLamportsPerTransaction, perRun[SOL] === undefined ? 0n : BigInt(perRun[SOL]));
548
+ const rules = [
549
+ { name: 'Never export the key', method: 'exportPrivateKey', conditions: [], action: 'DENY' },
550
+ // Privy's `in` takes at most 100 values: one rule per hundred programs.
551
+ ...Array.from({ length: Math.ceil(programs.length / PRIVY_IN_LIMIT) }, (_, chunk) => rule(chunk === 0 ? 'Programs the steps may call' : `Programs the steps may call (${chunk + 1})`, [
552
+ {
553
+ field_source: 'solana_program_instruction',
554
+ field: 'programId',
555
+ operator: 'in',
556
+ value: programs.slice(chunk * PRIVY_IN_LIMIT, (chunk + 1) * PRIVY_IN_LIMIT),
557
+ },
558
+ ])),
559
+ rule('SOL transfers up to the per-run cap', [
560
+ { field_source: 'solana_system_program_instruction', field: 'instructionName', operator: 'eq', value: 'Transfer' },
561
+ { field_source: 'solana_system_program_instruction', field: 'Transfer.lamports', operator: 'lte', value: String(solCap ?? 0n) },
562
+ ]),
563
+ // Wrapped SOL counts as SOL everywhere else, so its transfers share the SOL cap.
564
+ ...NATIVE_MINTS.map((mint) => rule(`Wrapped SOL (${mint}) transfers up to the per-run cap`, [
565
+ { field_source: 'solana_token_program_instruction', field: 'instructionName', operator: 'eq', value: 'TransferChecked' },
566
+ { field_source: 'solana_token_program_instruction', field: 'TransferChecked.mint', operator: 'eq', value: mint },
567
+ { field_source: 'solana_token_program_instruction', field: 'TransferChecked.amount', operator: 'lte', value: String(solCap ?? 0n) },
568
+ ])),
569
+ rule('Token accounts closed back to the wallet', [
570
+ { field_source: 'solana_token_program_instruction', field: 'instructionName', operator: 'eq', value: 'CloseAccount' },
571
+ { field_source: 'solana_token_program_instruction', field: 'CloseAccount.destination', operator: 'eq', value: consent.wallet },
572
+ ]),
573
+ rule('Token accounts opened for the wallet', [
574
+ { field_source: 'solana_token_program_instruction', field: 'instructionName', operator: 'eq', value: 'InitializeAccount3' },
575
+ ]),
576
+ ];
577
+ const mints = new Set([...(policy.maxTokenAmounts?.keys() ?? []), ...Object.keys(perRun).filter((key) => key !== SOL)]);
578
+ for (const mint of [...mints].sort()) {
579
+ // Covered by the wrapped SOL rules above.
580
+ if (NATIVE_MINTS.includes(mint))
581
+ continue;
582
+ const cap = minimum(policy.maxTokenAmounts?.get(mint), perRun[mint] === undefined ? undefined : BigInt(perRun[mint]));
583
+ // A mint missing from either side may not leave: the stricter side wins.
584
+ if (cap === undefined || !policy.maxTokenAmounts?.has(mint) || perRun[mint] === undefined)
585
+ continue;
586
+ rules.push(rule(`Transfers of ${mint} up to the per-run cap`, [
587
+ { field_source: 'solana_token_program_instruction', field: 'instructionName', operator: 'eq', value: 'TransferChecked' },
588
+ { field_source: 'solana_token_program_instruction', field: 'TransferChecked.mint', operator: 'eq', value: mint },
589
+ { field_source: 'solana_token_program_instruction', field: 'TransferChecked.amount', operator: 'lte', value: cap.toString() },
590
+ ]));
591
+ }
592
+ const unenforced = [
593
+ 'deployments and clusters: Privy does not know which deployment or cluster a transaction is for',
594
+ 'totals: the transfer caps apply to each instruction, so several capped transfers in one transaction or run can add up to more than maxSolPerTransaction, maxTokenAmounts or the consent per-run limits',
595
+ 'amounts a protocol program moves by CPI: Privy checks top-level instructions only, so maxSolPerTransaction, maxTokenAmounts and the consent per-run limits bind direct transfers only',
596
+ 'authority refusals in inner instructions (approvals or authority changes a program makes by CPI)',
597
+ 'transactions whose effect cannot be simulated: Privy policies do not read simulations',
598
+ 'consent per-window limits: Privy has no cumulative limits on Solana',
599
+ 'wrapped SOL a protocol program spends by CPI, and lamports of token accounts closed by CPI',
600
+ 'steps with other top-level System or Token instructions (for example creating an account or syncNative to wrap SOL): Privy refuses them, and privySigner refuses them before asking',
601
+ ];
602
+ return {
603
+ policy: {
604
+ version: '1.0',
605
+ name: options.name ?? `Arete automations for ${consent.wallet}`.slice(0, 50),
606
+ chain_type: 'solana',
607
+ rules,
608
+ },
609
+ unenforced,
610
+ };
611
+ }
612
+
613
+ export { PRIVY_ALLOWED_INSTRUCTIONS, privyPolicyFor, privySigner };
614
+ //# sourceMappingURL=privy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privy.js","sources":["../src/policy/encoding.ts","../src/policy/authority.ts","../src/consent/consent.ts","../src/policy/decode.ts","../src/policy/policy.ts","../src/signer/signer.ts","../src/privy/privy.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":[],"mappings":";;;AAEM,SAAU,YAAY,CAAC,KAAiB,EAAA;AAC5C,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAeD;AACM,SAAU,YAAY,CAAC,IAAY,EAAA;AACvC,IAAA,IAAI;AACF,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KAC5B;AAAC,IAAA,MAAM;AACN,QAAA,OAAO,IAAI,CAAC;KACb;AACH;;AC1BA;;;;;;;;;;;;;;;;;AAiBG;AAKH;AACO,MAAM,cAAc,GAAG;IAC5B,6CAA6C;IAC7C,6CAA6C;CACrC,CAAC;AACJ,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,6CAA6C,CAAC;AACzE,MAAM,aAAa,GAAG,6CAA6C,CAAC;AAC3E;AACO,MAAM,YAAY,GAAG;IAC1B,6CAA6C;IAC7C,8CAA8C;CACtC,CAAC;AA2EL,SAAU,cAAc,CAAC,OAAe,EAAA;AAC5C,IAAA,OAAQ,cAAoC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjE,CAAC;AAMD,MAAM,WAAW,GAA2B;AAC1C,IAAA,CAAC,EAAE,gBAAgB;AACnB,IAAA,CAAC,EAAE,mBAAmB;AACtB,IAAA,CAAC,EAAE,oBAAoB;AACvB,IAAA,CAAC,EAAE,UAAU;AACb,IAAA,CAAC,EAAE,SAAS;AACZ,IAAA,CAAC,EAAE,QAAQ;AACX,IAAA,CAAC,EAAE,cAAc;AACjB,IAAA,CAAC,EAAE,QAAQ;AACX,IAAA,CAAC,EAAE,MAAM;AACT,IAAA,CAAC,EAAE,cAAc;AACjB,IAAA,EAAE,EAAE,eAAe;AACnB,IAAA,EAAE,EAAE,aAAa;AACjB,IAAA,EAAE,EAAE,iBAAiB;AACrB,IAAA,EAAE,EAAE,gBAAgB;AACpB,IAAA,EAAE,EAAE,eAAe;AACnB,IAAA,EAAE,EAAE,aAAa;AACjB,IAAA,EAAE,EAAE,oBAAoB;AACxB,IAAA,EAAE,EAAE,YAAY;AAChB,IAAA,EAAE,EAAE,oBAAoB;AACxB,IAAA,EAAE,EAAE,qBAAqB;AACzB,IAAA,EAAE,EAAE,iBAAiB;AACrB,IAAA,EAAE,EAAE,oBAAoB;AACxB,IAAA,EAAE,EAAE,0BAA0B;AAC9B,IAAA,EAAE,EAAE,kBAAkB;AACtB,IAAA,EAAE,EAAE,kBAAkB;AACtB,IAAA,EAAE,EAAE,8BAA8B;AAClC,IAAA,EAAE,EAAE,YAAY;AAChB,IAAA,EAAE,EAAE,kBAAkB;AACtB,IAAA,EAAE,EAAE,wBAAwB;CAC7B,CAAC;AAEF,MAAM,YAAY,GAAG;IACnB,eAAe;IACf,QAAQ;IACR,UAAU;IACV,uBAAuB;IACvB,cAAc;IACd,mBAAmB;IACnB,iBAAiB;IACjB,gBAAgB;IAChB,UAAU;IACV,kBAAkB;IAClB,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;CACf,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB,YAAY;IACZ,WAAW;IACX,UAAU;IACV,OAAO;IACP,UAAU;IACV,YAAY;IACZ,WAAW;IACX,OAAO;IACP,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,0BAA0B;IAC1B,kBAAkB;IAClB,sBAAsB;IACtB,sBAAsB;IACtB,YAAY;CACb,CAAC;AAEF,SAAS,SAAS,CAAC,IAAgB,EAAA;AACjC,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,kBAAkB,CAAC;IACjD,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,wBAAwB,CAAC;IACjE,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAmB,gBAAA,EAAA,GAAG,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,MAAM,CAAC,IAAgB,EAAA;AAC9B,IAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;AAAE,QAAA,OAAO,SAAS,CAAC;AACtC,IAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,IAAI,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB,EAAE,KAAwB,EAAE,QAAgB,EAAA;AAC9E,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,kBAAkB,CAAC;IACjD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC;AAC3C,CAAC;AAED;AACgB,SAAA,eAAe,CAAC,OAAe,EAAE,IAAgB,EAAA;IAC/D,IAAI,cAAc,CAAC,OAAO,CAAC;AAAE,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,cAAc;QAAE,OAAO,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAC3F,IAAI,OAAO,KAAK,aAAa;QAAE,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;AACxF,IAAA,IAAI,OAAO,KAAK,kBAAkB,EAAE;AAClC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,OAAO,GAAG,KAAK,SAAS,GAAG,kBAAkB,GAAG,CAA+B,4BAAA,EAAA,GAAG,EAAE,CAAC;KACtF;AACD,IAAA,OAAO,IAAI,CAAC;AACd;;ACpNA;;;;;;;;;;;;AAYG;AAUH;AACO,MAAM,GAAG,GAAG,KAAK;;ACalB,MAAO,sBAAuB,SAAQ,KAAK,CAAA;AAC/C,IAAA,WAAA,CAAY,OAAe,EAAA;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;AACf,QAAA,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;KACtC;AACF,CAAA;AAED;AACA,MAAM,SAAS,GAAG,IAAI,CAAC;AACvB;AACA,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAErC,MAAM,MAAM,CAAA;AAIC,IAAA,KAAA,CAAA;AAHX,IAAA,EAAE,CAAS;AAEX,IAAA,WAAA,CACW,KAAiB,EAC1B,EAAE,GAAG,CAAC,EAAA;QADG,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;AAG1B,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;KACd;IAED,UAAU,GAAA;QACR,IAAI,KAAK,GAAG,CAAC,CAAC;AACd,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,IAAI,KAAK,SAAS;AAAE,gBAAA,MAAM,IAAI,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;AAClF,YAAA,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AACb,YAAA,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;AACtC,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC;AAAE,gBAAA,OAAO,KAAK,CAAC;SACvC;AACD,QAAA,MAAM,IAAI,sBAAsB,CAAC,4BAA4B,CAAC,CAAC;KAChE;AAED,IAAA,IAAI,CAAC,MAAc,EAAA;AACjB,QAAA,IAAI,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACxC,YAAA,MAAM,IAAI,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;SAC3D;AACD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC;AAClB,QAAA,OAAO,KAAK,CAAC;KACd;IAED,IAAI,GAAA;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;KACzB;AACF,CAAA;AAED,SAAS,eAAe,CACtB,QAAgB,EAChB,QAAgB,EAChB,cAAsB,EACtB,gBAAwB,EAAA;AAExB,IAAA,IAAI,QAAQ,GAAG,QAAQ,IAAI,cAAc,GAAG,QAAQ,IAAI,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,EAAE;AAC9F,QAAA,MAAM,IAAI,sBAAsB,CAAC,wBAAwB,CAAC,CAAC;KAC5D;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC7C,MAAM,QAAQ,GACZ,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAC7F,QAAA,IAAI,QAAQ;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC/B;AACD,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;AAED;AACM,SAAU,iBAAiB,CAAC,KAAiB,EAAA;AACjD,IAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;AAAE,QAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnD,IAAA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACjC,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;AAC3C,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC;IAClC,MAAM,UAAU,GAAiB,EAAE,CAAC;AACpC,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,cAAc,EAAE,KAAK,EAAE,EAAE;QACnD,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;KAClC;AACD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,MAAM,IAAI,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;IAC/E,IAAI,OAAO,GAAa,IAAI,CAAC;IAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,EAAE;AACxB,QAAA,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AACf,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC;AAAE,YAAA,MAAM,IAAI,sBAAsB,CAAC,iCAAiC,CAAC,CAAC;QAC9F,OAAO,GAAG,CAAC,CAAC;KACb;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;AAC1F,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACrC,MAAM,UAAU,GAAa,EAAE,CAAC;AAChC,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE;AAC7C,QAAA,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAChD;AACD,IAAA,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;AAC7F,IAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChB,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7C,MAAM,mBAAmB,GAAa,EAAE,CAAC;IACzC,MAAM,YAAY,GAA0B,EAAE,CAAC;AAC/C,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,EAAE,KAAK,EAAE,EAAE;AACrD,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,YAAY,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjF,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;AACzC,QAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,YAAA,MAAM,IAAI,sBAAsB,CAAC,8CAA8C,CAAC,CAAC;SAClF;AACD,QAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACnC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;AAC7B,IAAA,IAAI,OAAO,KAAK,IAAI,EAAE;AACpB,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;AAClC,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,YAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AACvD,YAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC7C;KACF;IACD,OAAO;QACL,OAAO;QACP,UAAU;QACV,eAAe;QACf,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE;AACnD,QAAA,kBAAkB,EAAE,QAAQ;QAC5B,UAAU;QACV,cAAc;QACd,mBAAmB;QACnB,YAAY;QACZ,OAAO;KACR,CAAC;AACJ,CAAC;AAED;AACA,SAAS,QAAQ,CAAC,KAAiB,EAAA;IACjC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjC,IAAA,MAAM,IAAI,GACR,CAAC,SAAS,CAAC,CAAC,CAAE,IAAI,SAAS,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IAC/F,IAAI,CAAC,IAAI,GAAG,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,EAAE;AAC9C,QAAA,MAAM,IAAI,sBAAsB,CAAC,0CAA0C,CAAC,CAAC;KAC9E;AACD,IAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChB,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;AACvC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;AAChC,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE;AAC7C,QAAA,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAChD;IACD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChC,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1D,MAAM,mBAAmB,GAAa,EAAE,CAAC;IACzC,MAAM,YAAY,GAA0B,EAAE,CAAC;AAC/C,IAAA,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE;AACzD,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAE,CAAC;QACtC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;AAC1C,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,YAAY,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjF,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;AACzC,QAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,YAAA,MAAM,IAAI,sBAAsB,CAAC,4CAA4C,CAAC,CAAC;SAChF;AACD,QAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACnC;AACD,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAiB,EAAE,CAAC;AACpC,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC7C,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;KAClC;IACD,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,EAAE;AAC9B,QAAA,MAAM,IAAI,sBAAsB,CAAC,sCAAsC,CAAC,CAAC;KAC1E;IACD,OAAO;AACL,QAAA,OAAO,EAAE,CAAC;QACV,UAAU;AACV,QAAA,eAAe,EAAE,UAAU;QAC3B,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE;AACtC,QAAA,kBAAkB,EAAE,QAAQ;QAC5B,UAAU;QACV,cAAc,EAAE,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC;QACrF,mBAAmB;QACnB,YAAY;AACZ,QAAA,OAAO,EAAE,EAAE;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAA;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;AACd,IAAA,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC;AAAE,QAAA,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AACxE,IAAA,OAAO,KAAK,CAAC;AACf;;ACrOA;;;;;;;;;;;;AAYG;AA2BH;;;;;AAKG;AACI,MAAM,gBAAgB,GAAG;IAC9B,6CAA6C;IAC7C,6CAA6C;IAC7C,6CAA6C;IAC7C,kCAAkC;IAClC,8CAA8C;IAC9C,6CAA6C;IAC7C,6CAA6C;CACrC;;ACCV;;;;AAIG;AACH,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AAElE,MAAO,aAAc,SAAQ,KAAK,CAAA;AAC7B,IAAA,IAAI,CAA2C;;AAE/C,IAAA,CAAC,aAAa,IAAI,IAAI,CAAC;IAEhC,WAAY,CAAA,OAAe,EAAE,IAAA,GAAiD,iBAAiB,EAAA;QAC7F,KAAK,CAAC,OAAO,CAAC,CAAC;AACf,QAAA,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;AAC5B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;KAClB;AACF;;ACvED;;;;;;;;;;;;;;AAcG;AAkDH;;;;AAIG;AACU,MAAA,0BAA0B,GAA4D;IACjG,MAAM,EAAE,CAAC,UAAU,CAAC;AACpB,IAAA,KAAK,EAAE,CAAC,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,CAAC;EAChE;AAEF;AACA,SAAS,sBAAsB,CAAC,iBAAyB,EAAA;AACvD,IAAA,MAAM,KAAK,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAC9C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI,CAAC;AACxB,IAAA,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACzC,IAAA,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;AACpC,QAAA,MAAM,QAAQ,GAAG,OAAO,KAAK,cAAc,CAAC;QAC5C,MAAM,OAAO,GAAI,cAAoC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACxE,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,SAAS;AACpC,QAAA,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;AACrE,QAAA,MAAM,OAAO,GAAG,0BAA0B,CAAC,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;AAC1E,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,CAAG,EAAA,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAM,GAAA,EAAA,IAAI,IAAI,CAAC;KACpF;AACD,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAED;AACA,SAAS,eAAe,CAAC,KAAc,EAAA;AACrC,IAAA,MAAM,MAAM,GAAI,KAAqC,EAAE,MAAM,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAE,KAAsC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC/E,OAAO,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzD,CAAC;AAED;AACM,SAAU,WAAW,CAAC,OAA2B,EAAA;IACrD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC;AAChE,IAAA,IAAI,CAAC,uBAAuB;AAAE,QAAA,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;AACpG,IAAA,MAAM,QAAQ,GAAG,OAAO,MAAc,KAAI;AACxC,QAAA,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,aAAa,CAAC,CAAA,0BAAA,EAA6B,MAAM,CAAE,CAAA,EAAE,oBAAoB,CAAC,CAAC;AAC9F,QAAA,OAAO,EAAE,CAAC;AACZ,KAAC,CAAC;IACF,OAAO;AACL,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,2BAA2B,EAAE,OAAO,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC;QACjE,MAAM,OAAO,CAAC,MAAM,EAAA;YAClB,OAAO,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;SAC7C;QACD,MAAM,gBAAgB,CAAC,MAAM,EAAA;AAC3B,YAAA,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;YAC1G,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC;AAChC,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,8CAA8C,EAAE,CAAC;AACpH,YAAA,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AACpD,YAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SACnF;AACD,QAAA,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAyB,EAAA;AACpE,YAAA,IAAI,OAAO,CAAC,iBAAiB,KAAK,KAAK,EAAE;AACvC,gBAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;oBACtC,MAAM,WAAW,GAAG,sBAAsB,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;oBAC1E,IAAI,WAAW,EAAE;wBACf,MAAM,IAAI,aAAa,CACrB,CAAe,YAAA,EAAA,WAAW,CAAC,KAAK,CAAoB,iBAAA,EAAA,WAAW,CAA2F,yFAAA,CAAA,CAC3J,CAAC;qBACH;iBACF;aACF;AACD,YAAA,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,MAAM,GAAa,EAAE,CAAC;AAC5B,YAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;AACtC,gBAAA,IAAI,MAAmE,CAAC;AACxE,gBAAA,IAAI;AACF,oBAAA,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE;wBAC1D,WAAW,EAAE,WAAW,CAAC,iBAAiB;AAC1C,wBAAA,qBAAqB,EAAE,EAAE,0BAA0B,EAAE,CAAC,uBAAuB,CAAC,EAAE;AACjF,qBAAA,CAAC,CAAC;iBACJ;gBAAC,OAAO,KAAK,EAAE;AACd,oBAAA,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;AAC1B,wBAAA,MAAM,IAAI,aAAa,CAAC,CAAqC,kCAAA,EAAA,WAAW,CAAC,KAAK,CAAA,EAAA,EAAK,MAAM,CAAE,KAAe,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;qBACxH;AACD,oBAAA,MAAM,KAAK,CAAC;iBACb;gBACD,MAAM,KAAK,GAAG,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,kBAAkB,CAAC;gBACpE,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACvF,gBAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACpB;AACD,YAAA,OAAO,MAAM,CAAC;SACf;KACF,CAAC;AACJ,CAAC;AA2BD,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAS,CAAC,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AACpF;AACA,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,SAAS,OAAO,CAAC,GAAG,MAAiC,EAAA;AACnD,IAAA,OAAO,MAAM,CAAC,MAAM,CAAqB,CAAC,GAAG,EAAE,KAAK,MAAM,KAAK,KAAK,SAAS,GAAG,GAAG,GAAG,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AACpJ,CAAC;AAED;;;;;;;;;;;;;AAaG;AACG,SAAU,cAAc,CAC5B,MAAoB,EACpB,OAAkF,EAClF,UAAsC,EAAE,EAAA;AAExC,IAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE;AAC5B,QAAA,MAAM,IAAI,SAAS,CACjB,kGAAkG,CACnG,CAAC;KACH;AACD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC;AAC7D,IAAA,MAAM,KAAK,GAAyB;AAClC,QAAA,YAAY,EAAE,QAAQ;AACtB,QAAA,KAAK,EAAE,wBAAwB;AAC/B,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,KAAK,EAAE,OAAO;KACf,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,UAAkC,MAAuB;QACnF,IAAI;AACJ,QAAA,MAAM,EAAE,iBAAiB;AACzB,QAAA,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC;AAClC,QAAA,MAAM,EAAE,OAAO;AAChB,KAAA,CAAC,CAAC;AACH,IAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,gBAAgB,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACnI,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;;AAE3C,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/G,IAAA,MAAM,KAAK,GAAsB;AAC/B,QAAA,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;;AAE5F,QAAA,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAC9E,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,6BAA6B,GAAG,CAAA,6BAAA,EAAgC,KAAK,GAAG,CAAC,GAAG,EAAE;AAC/F,YAAA;AACE,gBAAA,YAAY,EAAE,4BAA4B;AAC1C,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,cAAc,CAAC;AAC5E,aAAA;AACF,SAAA,CAAC,CACH;QACD,IAAI,CAAC,qCAAqC,EAAE;AAC1C,YAAA,EAAE,YAAY,EAAE,mCAAmC,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;YAClH,EAAE,YAAY,EAAE,mCAAmC,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;SAChI,CAAC;;AAEF,QAAA,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,KACvB,IAAI,CAAC,CAAgB,aAAA,EAAA,IAAI,mCAAmC,EAAE;AAC5D,YAAA,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;AACxH,YAAA,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YAChH,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;AACpI,SAAA,CAAC,CACH;QACD,IAAI,CAAC,0CAA0C,EAAE;AAC/C,YAAA,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE;AACrH,YAAA,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE;SAC/H,CAAC;QACF,IAAI,CAAC,sCAAsC,EAAE;AAC3C,YAAA,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE;SAC5H,CAAC;KACH,CAAC;AACF,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACxH,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;;AAEpC,QAAA,IAAK,YAAkC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;AACjE,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;AAEtH,QAAA,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QACpG,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,CAAgB,aAAA,EAAA,IAAI,wBAAwB,EAAE;AACjD,YAAA,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;AACxH,YAAA,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;AAChH,YAAA,EAAE,YAAY,EAAE,kCAAkC,EAAE,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE;AAC9H,SAAA,CAAC,CACH,CAAC;KACH;AACD,IAAA,MAAM,UAAU,GAAG;QACjB,gGAAgG;QAChG,wMAAwM;QACxM,uLAAuL;QACvL,kGAAkG;QAClG,uFAAuF;QACvF,qEAAqE;QACrE,4FAA4F;QAC5F,qLAAqL;KACtL,CAAC;IACF,OAAO;AACL,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,yBAAyB,OAAO,CAAC,MAAM,CAAA,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5E,YAAA,UAAU,EAAE,QAAQ;YACpB,KAAK;AACN,SAAA;QACD,UAAU;KACX,CAAC;AACJ;;;;"}