@helium/spl-utils 0.0.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/LICENSE +203 -0
- package/lib/cjs/accountFetchCache/accountFetchCache.js +365 -0
- package/lib/cjs/accountFetchCache/accountFetchCache.js.map +1 -0
- package/lib/cjs/accountFetchCache/eventEmitter.js +37 -0
- package/lib/cjs/accountFetchCache/eventEmitter.js.map +1 -0
- package/lib/cjs/accountFetchCache/getMultipleAccounts.js +53 -0
- package/lib/cjs/accountFetchCache/getMultipleAccounts.js.map +1 -0
- package/lib/cjs/accountFetchCache/index.js +20 -0
- package/lib/cjs/accountFetchCache/index.js.map +1 -0
- package/lib/cjs/accountsResolver/ataResolver.js +35 -0
- package/lib/cjs/accountsResolver/ataResolver.js.map +1 -0
- package/lib/cjs/accountsResolver/combineResolvers.js +27 -0
- package/lib/cjs/accountsResolver/combineResolvers.js.map +1 -0
- package/lib/cjs/accountsResolver/individual.js +90 -0
- package/lib/cjs/accountsResolver/individual.js.map +1 -0
- package/lib/cjs/accountsResolver/utils.js +32 -0
- package/lib/cjs/accountsResolver/utils.js.map +1 -0
- package/lib/cjs/anchorError.js +265 -0
- package/lib/cjs/anchorError.js.map +1 -0
- package/lib/cjs/constants.js +8 -0
- package/lib/cjs/constants.js.map +1 -0
- package/lib/cjs/executeRemoteTxn.js +109 -0
- package/lib/cjs/executeRemoteTxn.js.map +1 -0
- package/lib/cjs/extendBorsh.js +33 -0
- package/lib/cjs/extendBorsh.js.map +1 -0
- package/lib/cjs/index.js +35 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/token.js +196 -0
- package/lib/cjs/token.js.map +1 -0
- package/lib/cjs/transaction.js +308 -0
- package/lib/cjs/transaction.js.map +1 -0
- package/lib/cjs/utils.js +58 -0
- package/lib/cjs/utils.js.map +1 -0
- package/lib/esm/src/accountFetchCache/accountFetchCache.js +338 -0
- package/lib/esm/src/accountFetchCache/accountFetchCache.js.map +1 -0
- package/lib/esm/src/accountFetchCache/eventEmitter.js +33 -0
- package/lib/esm/src/accountFetchCache/eventEmitter.js.map +1 -0
- package/lib/esm/src/accountFetchCache/getMultipleAccounts.js +32 -0
- package/lib/esm/src/accountFetchCache/getMultipleAccounts.js.map +1 -0
- package/lib/esm/src/accountFetchCache/index.js +4 -0
- package/lib/esm/src/accountFetchCache/index.js.map +1 -0
- package/lib/esm/src/accountsResolver/ataResolver.js +22 -0
- package/lib/esm/src/accountsResolver/ataResolver.js.map +1 -0
- package/lib/esm/src/accountsResolver/combineResolvers.js +14 -0
- package/lib/esm/src/accountsResolver/combineResolvers.js.map +1 -0
- package/lib/esm/src/accountsResolver/individual.js +72 -0
- package/lib/esm/src/accountsResolver/individual.js.map +1 -0
- package/lib/esm/src/accountsResolver/utils.js +27 -0
- package/lib/esm/src/accountsResolver/utils.js.map +1 -0
- package/lib/esm/src/anchorError.js +262 -0
- package/lib/esm/src/anchorError.js.map +1 -0
- package/lib/esm/src/constants.js +5 -0
- package/lib/esm/src/constants.js.map +1 -0
- package/lib/esm/src/executeRemoteTxn.js +79 -0
- package/lib/esm/src/executeRemoteTxn.js.map +1 -0
- package/lib/esm/src/extendBorsh.js +26 -0
- package/lib/esm/src/extendBorsh.js.map +1 -0
- package/lib/esm/src/index.js +13 -0
- package/lib/esm/src/index.js.map +1 -0
- package/lib/esm/src/token.js +175 -0
- package/lib/esm/src/token.js.map +1 -0
- package/lib/esm/src/transaction.js +274 -0
- package/lib/esm/src/transaction.js.map +1 -0
- package/lib/esm/src/utils.js +44 -0
- package/lib/esm/src/utils.js.map +1 -0
- package/lib/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/lib/types/src/accountFetchCache/accountFetchCache.d.ts +67 -0
- package/lib/types/src/accountFetchCache/accountFetchCache.d.ts.map +1 -0
- package/lib/types/src/accountFetchCache/eventEmitter.d.ts +19 -0
- package/lib/types/src/accountFetchCache/eventEmitter.d.ts.map +1 -0
- package/lib/types/src/accountFetchCache/getMultipleAccounts.d.ts +7 -0
- package/lib/types/src/accountFetchCache/getMultipleAccounts.d.ts.map +1 -0
- package/lib/types/src/accountFetchCache/index.d.ts +4 -0
- package/lib/types/src/accountFetchCache/index.d.ts.map +1 -0
- package/lib/types/src/accountsResolver/ataResolver.d.ts +9 -0
- package/lib/types/src/accountsResolver/ataResolver.d.ts.map +1 -0
- package/lib/types/src/accountsResolver/combineResolvers.d.ts +3 -0
- package/lib/types/src/accountsResolver/combineResolvers.d.ts.map +1 -0
- package/lib/types/src/accountsResolver/individual.d.ts +25 -0
- package/lib/types/src/accountsResolver/individual.d.ts.map +1 -0
- package/lib/types/src/accountsResolver/utils.d.ts +7 -0
- package/lib/types/src/accountsResolver/utils.d.ts.map +1 -0
- package/lib/types/src/anchorError.d.ts +9 -0
- package/lib/types/src/anchorError.d.ts.map +1 -0
- package/lib/types/src/constants.d.ts +5 -0
- package/lib/types/src/constants.d.ts.map +1 -0
- package/lib/types/src/executeRemoteTxn.d.ts +23 -0
- package/lib/types/src/executeRemoteTxn.d.ts.map +1 -0
- package/lib/types/src/extendBorsh.d.ts +3 -0
- package/lib/types/src/extendBorsh.d.ts.map +1 -0
- package/lib/types/src/index.d.ts +13 -0
- package/lib/types/src/index.d.ts.map +1 -0
- package/lib/types/src/token.d.ts +16 -0
- package/lib/types/src/token.d.ts.map +1 -0
- package/lib/types/src/transaction.d.ts +26 -0
- package/lib/types/src/transaction.d.ts.map +1 -0
- package/lib/types/src/utils.d.ts +12 -0
- package/lib/types/src/utils.d.ts.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { Transaction, } from "@solana/web3.js";
|
|
2
|
+
import { ProgramError } from "./anchorError";
|
|
3
|
+
async function sleep(ms) {
|
|
4
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
5
|
+
}
|
|
6
|
+
async function promiseAllInOrder(it) {
|
|
7
|
+
let ret = [];
|
|
8
|
+
for (const i of it) {
|
|
9
|
+
ret.push(await i());
|
|
10
|
+
}
|
|
11
|
+
return ret;
|
|
12
|
+
}
|
|
13
|
+
export async function sendInstructions(provider, instructions, signers = [], payer = provider.wallet.publicKey, commitment = "confirmed", idlErrors = new Map()) {
|
|
14
|
+
let tx = new Transaction();
|
|
15
|
+
tx.recentBlockhash = (await provider.connection.getRecentBlockhash()).blockhash;
|
|
16
|
+
tx.feePayer = payer || provider.wallet.publicKey;
|
|
17
|
+
tx.add(...instructions);
|
|
18
|
+
if (signers.length > 0) {
|
|
19
|
+
tx.partialSign(...signers);
|
|
20
|
+
}
|
|
21
|
+
tx = await provider.wallet.signTransaction(tx);
|
|
22
|
+
try {
|
|
23
|
+
const { txid } = await sendAndConfirmWithRetry(provider.connection, tx.serialize(), {
|
|
24
|
+
skipPreflight: true,
|
|
25
|
+
}, commitment);
|
|
26
|
+
return txid;
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
console.error(e);
|
|
30
|
+
const wrappedE = ProgramError.parse(e, idlErrors);
|
|
31
|
+
throw wrappedE == null ? e : wrappedE;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function truthy(value) {
|
|
35
|
+
return !!value;
|
|
36
|
+
}
|
|
37
|
+
export async function sendMultipleInstructions(provider, instructionGroups, signerGroups, payer, finality = "confirmed", idlErrors = new Map()) {
|
|
38
|
+
const recentBlockhash = (await provider.connection.getRecentBlockhash("confirmed")).blockhash;
|
|
39
|
+
const ixAndSigners = instructionGroups
|
|
40
|
+
.map((instructions, i) => {
|
|
41
|
+
const signers = signerGroups[i];
|
|
42
|
+
return {
|
|
43
|
+
instructions,
|
|
44
|
+
signers,
|
|
45
|
+
};
|
|
46
|
+
})
|
|
47
|
+
.filter(({ instructions }) => instructions.length > 0);
|
|
48
|
+
const txns = ixAndSigners.map(({ instructions }) => {
|
|
49
|
+
const tx = new Transaction({
|
|
50
|
+
feePayer: payer || provider.wallet.publicKey,
|
|
51
|
+
recentBlockhash,
|
|
52
|
+
});
|
|
53
|
+
tx.add(...instructions);
|
|
54
|
+
return tx;
|
|
55
|
+
});
|
|
56
|
+
const txnsSignedByWallet = await provider.wallet.signAllTransactions(txns);
|
|
57
|
+
const txnsSigned = txnsSignedByWallet
|
|
58
|
+
.map((tx, index) => {
|
|
59
|
+
const signers = ixAndSigners[index].signers;
|
|
60
|
+
if (signers.length > 0) {
|
|
61
|
+
tx.partialSign(...signers);
|
|
62
|
+
}
|
|
63
|
+
return tx;
|
|
64
|
+
})
|
|
65
|
+
.map((tx) => tx.serialize());
|
|
66
|
+
console.log("Sending multiple transactions...");
|
|
67
|
+
try {
|
|
68
|
+
return await promiseAllInOrder(txnsSigned.map((txn) => async () => {
|
|
69
|
+
const { txid } = await sendAndConfirmWithRetry(provider.connection, txn, {
|
|
70
|
+
skipPreflight: true,
|
|
71
|
+
}, finality);
|
|
72
|
+
return txid;
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
console.error(e);
|
|
77
|
+
const wrappedE = ProgramError.parse(e, idlErrors);
|
|
78
|
+
throw wrappedE == null ? e : wrappedE;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export async function execute(program, provider, command, payer = provider.wallet.publicKey, commitment) {
|
|
82
|
+
const { instructions, signers, output } = command;
|
|
83
|
+
const errors = program.idl.errors?.reduce((acc, err) => {
|
|
84
|
+
acc.set(err.code, `${err.name}: ${err.msg}`);
|
|
85
|
+
return acc;
|
|
86
|
+
}, new Map());
|
|
87
|
+
if (instructions.length > 0) {
|
|
88
|
+
const txid = await sendInstructions(provider, instructions, signers, payer, commitment, errors);
|
|
89
|
+
return { txid, ...output };
|
|
90
|
+
}
|
|
91
|
+
// @ts-ignore
|
|
92
|
+
return output;
|
|
93
|
+
}
|
|
94
|
+
export async function executeBig(program, provider, command, payer = provider.wallet.publicKey, finality) {
|
|
95
|
+
const { instructions, signers, output } = command;
|
|
96
|
+
const errors = program.idl.errors?.reduce((acc, err) => {
|
|
97
|
+
acc.set(err.code, `${err.name}: ${err.msg}`);
|
|
98
|
+
return acc;
|
|
99
|
+
}, new Map());
|
|
100
|
+
if (instructions.length > 0) {
|
|
101
|
+
const txids = await sendMultipleInstructions(provider, instructions, signers, payer || provider.wallet.publicKey, finality, errors);
|
|
102
|
+
return {
|
|
103
|
+
...output,
|
|
104
|
+
txids: Array.from(txids),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// @ts-ignore
|
|
108
|
+
return output;
|
|
109
|
+
}
|
|
110
|
+
function getUnixTime() {
|
|
111
|
+
return new Date().valueOf() / 1000;
|
|
112
|
+
}
|
|
113
|
+
export const awaitTransactionSignatureConfirmation = async (txid, timeout, connection, commitment = "recent", queryStatus = false) => {
|
|
114
|
+
let done = false;
|
|
115
|
+
let status = {
|
|
116
|
+
slot: 0,
|
|
117
|
+
confirmations: 0,
|
|
118
|
+
err: null,
|
|
119
|
+
};
|
|
120
|
+
let subId = 0;
|
|
121
|
+
status = await new Promise(async (resolve, reject) => {
|
|
122
|
+
setTimeout(() => {
|
|
123
|
+
if (done) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
done = true;
|
|
127
|
+
console.log("Rejecting for timeout...");
|
|
128
|
+
reject({ timeout: true });
|
|
129
|
+
}, timeout);
|
|
130
|
+
try {
|
|
131
|
+
subId = connection.onSignature(txid, (result, context) => {
|
|
132
|
+
done = true;
|
|
133
|
+
status = {
|
|
134
|
+
err: result.err,
|
|
135
|
+
slot: context.slot,
|
|
136
|
+
confirmations: 0,
|
|
137
|
+
};
|
|
138
|
+
if (result.err) {
|
|
139
|
+
console.log("Rejected via websocket", result.err);
|
|
140
|
+
reject(status);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
resolve(status);
|
|
144
|
+
}
|
|
145
|
+
}, commitment);
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
done = true;
|
|
149
|
+
console.error("WS error in setup", txid, e);
|
|
150
|
+
}
|
|
151
|
+
while (!done && queryStatus) {
|
|
152
|
+
// eslint-disable-next-line no-loop-func
|
|
153
|
+
(async () => {
|
|
154
|
+
try {
|
|
155
|
+
const signatureStatuses = await connection.getSignatureStatuses([
|
|
156
|
+
txid,
|
|
157
|
+
]);
|
|
158
|
+
status = signatureStatuses && signatureStatuses.value[0];
|
|
159
|
+
if (!done) {
|
|
160
|
+
if (!status) {
|
|
161
|
+
}
|
|
162
|
+
else if (status.err) {
|
|
163
|
+
console.log("REST error for", txid, status);
|
|
164
|
+
done = true;
|
|
165
|
+
reject(status.err);
|
|
166
|
+
}
|
|
167
|
+
else if (!status.confirmations && !status.confirmationStatus) {
|
|
168
|
+
console.log("REST no confirmations for", txid, status);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
console.log("REST confirmation for", txid, status);
|
|
172
|
+
if (!status.confirmationStatus ||
|
|
173
|
+
status.confirmationStatus == commitment) {
|
|
174
|
+
done = true;
|
|
175
|
+
resolve(status);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
if (!done) {
|
|
182
|
+
console.log("REST connection error: txid", txid, e);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
})();
|
|
186
|
+
await sleep(2000);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
if (
|
|
190
|
+
//@ts-ignore
|
|
191
|
+
connection._signatureSubscriptions &&
|
|
192
|
+
//@ts-ignore
|
|
193
|
+
connection._signatureSubscriptions[subId]) {
|
|
194
|
+
connection.removeSignatureListener(subId);
|
|
195
|
+
}
|
|
196
|
+
done = true;
|
|
197
|
+
return status;
|
|
198
|
+
};
|
|
199
|
+
async function simulateTransaction(connection, transaction, commitment) {
|
|
200
|
+
// @ts-ignore
|
|
201
|
+
transaction.recentBlockhash = await connection._recentBlockhash(
|
|
202
|
+
// @ts-ignore
|
|
203
|
+
connection._disableBlockhashCaching);
|
|
204
|
+
const signData = transaction.serializeMessage();
|
|
205
|
+
// @ts-ignore
|
|
206
|
+
const wireTransaction = transaction._serialize(signData);
|
|
207
|
+
const encodedTransaction = wireTransaction.toString("base64");
|
|
208
|
+
const config = { encoding: "base64", commitment };
|
|
209
|
+
const args = [encodedTransaction, config];
|
|
210
|
+
// @ts-ignore
|
|
211
|
+
const res = await connection._rpcRequest("simulateTransaction", args);
|
|
212
|
+
if (res.error) {
|
|
213
|
+
throw new Error("failed to simulate transaction: " + res.error.message);
|
|
214
|
+
}
|
|
215
|
+
return res.result;
|
|
216
|
+
}
|
|
217
|
+
const DEFAULT_TIMEOUT = 3 * 60 * 1000; // 3 minutes
|
|
218
|
+
/*
|
|
219
|
+
A validator has up to 120s to accept the transaction and send it into a block.
|
|
220
|
+
If it doesn’t happen within that timeframe, your transaction is dropped and you’ll need
|
|
221
|
+
to send the transaction again. You can get the transaction signature and periodically
|
|
222
|
+
Ping the network for that transaction signature. If you never get anything back,
|
|
223
|
+
that means it’s definitely been dropped. If you do get a response back, you can keep pingindg
|
|
224
|
+
that means it’s definitely been dropped. If you do get a response back, you can keep pingindg
|
|
225
|
+
until it’s gone to a confirmed status to move on.
|
|
226
|
+
*/
|
|
227
|
+
export async function sendAndConfirmWithRetry(connection, txn, sendOptions, commitment, timeout = DEFAULT_TIMEOUT) {
|
|
228
|
+
let done = false;
|
|
229
|
+
let slot = 0;
|
|
230
|
+
const txid = await connection.sendRawTransaction(txn, sendOptions);
|
|
231
|
+
const startTime = getUnixTime();
|
|
232
|
+
(async () => {
|
|
233
|
+
while (!done && getUnixTime() - startTime < timeout) {
|
|
234
|
+
await connection.sendRawTransaction(txn, sendOptions);
|
|
235
|
+
await sleep(500);
|
|
236
|
+
}
|
|
237
|
+
})();
|
|
238
|
+
try {
|
|
239
|
+
const confirmation = await awaitTransactionSignatureConfirmation(txid, timeout, connection, commitment, true);
|
|
240
|
+
if (!confirmation)
|
|
241
|
+
throw new Error("Timed out awaiting confirmation on transaction");
|
|
242
|
+
if (confirmation.err) {
|
|
243
|
+
const tx = await connection.getTransaction(txid, {
|
|
244
|
+
commitment: "confirmed",
|
|
245
|
+
});
|
|
246
|
+
console.error(tx?.meta?.logMessages?.join("\n"));
|
|
247
|
+
console.error(confirmation.err);
|
|
248
|
+
throw new Error("Transaction failed: Custom instruction error");
|
|
249
|
+
}
|
|
250
|
+
slot = confirmation?.slot || 0;
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
console.error("Error caught", err);
|
|
254
|
+
if (err.timeout) {
|
|
255
|
+
throw new Error("Timed out awaiting confirmation on transaction");
|
|
256
|
+
}
|
|
257
|
+
const tx = await connection.getTransaction(txid, {
|
|
258
|
+
commitment: "confirmed",
|
|
259
|
+
});
|
|
260
|
+
if (tx && tx.meta && tx.meta.logMessages) {
|
|
261
|
+
console.error(tx.meta.logMessages.join("\n"));
|
|
262
|
+
}
|
|
263
|
+
if (err.err) {
|
|
264
|
+
throw err.err;
|
|
265
|
+
}
|
|
266
|
+
throw err;
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
done = true;
|
|
270
|
+
}
|
|
271
|
+
console.log("Latency", txid, getUnixTime() - startTime);
|
|
272
|
+
return { txid };
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import BN from "bn.js";
|
|
2
|
+
export const truthy = (value) => !!value;
|
|
3
|
+
export function toNumber(numberOrBn, mintOrDecimals) {
|
|
4
|
+
if (BN.isBN(numberOrBn)) {
|
|
5
|
+
return amountAsNum(numberOrBn, mintOrDecimals);
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
return numberOrBn;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function amountAsNum(amount, mintOrDecimals) {
|
|
12
|
+
const decimals = typeof mintOrDecimals === "number"
|
|
13
|
+
? mintOrDecimals
|
|
14
|
+
: mintOrDecimals.decimals;
|
|
15
|
+
const factor = new BN(Math.pow(10, decimals).toString());
|
|
16
|
+
const decimal = amount.mod(factor).toNumber() / factor.toNumber();
|
|
17
|
+
return amount.div(factor).toNumber() + decimal;
|
|
18
|
+
}
|
|
19
|
+
export function toBN(numberOrBn, mintOrDecimals) {
|
|
20
|
+
const decimals = typeof mintOrDecimals === "number"
|
|
21
|
+
? mintOrDecimals
|
|
22
|
+
: mintOrDecimals.decimals;
|
|
23
|
+
if (BN.isBN(numberOrBn)) {
|
|
24
|
+
return numberOrBn;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
return new BN(Math.ceil(Number(numberOrBn) * Math.pow(10, decimals)).toLocaleString("fullwide", { useGrouping: false }));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function supplyAsNum(mint) {
|
|
31
|
+
return amountAsNum(new BN(mint.supply.toString()), mint);
|
|
32
|
+
}
|
|
33
|
+
export function numberWithCommas(x, decimals = 4) {
|
|
34
|
+
return roundToDecimals(x, decimals).toLocaleString("en-US", {
|
|
35
|
+
maximumFractionDigits: decimals,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export function roundToDecimals(num, decimals) {
|
|
39
|
+
return Math.trunc(num * Math.pow(10, decimals)) / Math.pow(10, decimals);
|
|
40
|
+
}
|
|
41
|
+
export function humanReadable(bn, mint) {
|
|
42
|
+
return numberWithCommas(roundToDecimals(toNumber(bn, mint), mint.decimals));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,OAAO,CAAC;AAKvB,MAAM,CAAC,MAAM,MAAM,GAAG,CAAI,KAAQ,EAAsB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAEnE,MAAM,UAAU,QAAQ,CAAC,UAAuB,EAAE,cAA6B;IAC7E,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;QACvB,OAAO,WAAW,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;KAChD;SAAM;QACL,OAAO,UAAU,CAAC;KACnB;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAU,EAAE,cAA6B;IACnE,MAAM,QAAQ,GACZ,OAAO,cAAc,KAAK,QAAQ;QAChC,CAAC,CAAC,cAAc;QAChB,CAAC,CAAE,cAAuB,CAAC,QAAQ,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAClE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,UAAuB,EACvB,cAA6B;IAE7B,MAAM,QAAQ,GACZ,OAAO,cAAc,KAAK,QAAQ;QAChC,CAAC,CAAC,cAAc;QAChB,CAAC,CAAE,cAAuB,CAAC,QAAQ,CAAC;IAExC,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;QACvB,OAAO,UAAU,CAAC;KACnB;SAAM;QACL,OAAO,IAAI,EAAE,CACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,cAAc,CACnE,UAAU,EACV,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CACF,CAAC;KACH;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAU;IACpC,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,WAAmB,CAAC;IAC9D,OAAO,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;QAC1D,qBAAqB,EAAE,QAAQ;KAChC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,QAAgB;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,EAAM,EAAE,IAAU;IAC9C,OAAO,gBAAgB,CACrB,eAAe,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CACnD,CAAC;AACJ,CAAC"}
|