@rialo/ts-cdk 0.3.0-alpha.1 → 0.4.0-alpha.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/dist/index.mjs CHANGED
@@ -6955,11 +6955,11 @@ var QueryRpcClient = class extends BaseRpcClient {
6955
6955
  return result.value.map((v) => ({
6956
6956
  commission: BigInt(v.commission),
6957
6957
  pubkey: v.pubkey,
6958
- nodeIdentity: v.node_identity,
6959
- authorizedWithdrawer: v.authorized_withdrawer,
6960
- stakeNext: BigInt(v.stake_next),
6961
- stakeCurrent: v.stake_current !== void 0 ? BigInt(v.stake_current) : void 0,
6962
- address: v.address
6958
+ signingKey: v.signing_key,
6959
+ withdrawalKey: v.withdrawal_key,
6960
+ stake: BigInt(v.stake),
6961
+ address: v.address,
6962
+ stateSyncAddress: v.state_sync_address
6963
6963
  }));
6964
6964
  }
6965
6965
  /**
@@ -10873,6 +10873,364 @@ var KeypairSigner = class {
10873
10873
  return this.keypair.sign(message);
10874
10874
  }
10875
10875
  };
10876
+
10877
+ // src/program/constants.ts
10878
+ var RISCV_LOADER_PROGRAM_ID = "RiscVLoader11111111111111111111111111111111";
10879
+ var LOADER_V4_PROGRAM_ID = "LoaderV411111111111111111111111111111111111";
10880
+ var DEFAULT_CHUNK_SIZE = 3700;
10881
+ var DEFAULT_MAX_RETRIES2 = 350;
10882
+ var DEFAULT_RETRY_BASE_DELAY_MS = 50;
10883
+ var DEFAULT_RETRY_MAX_DELAY_MS = 1e3;
10884
+ var DEFAULT_CONFIRMATION_BATCH_SIZE = 25;
10885
+ var BUFFER_BALANCE_FACTOR = 1.2;
10886
+ var PROGRAM_DATA_OFFSET = 48;
10887
+
10888
+ // src/program/deployment.ts
10889
+ init_base();
10890
+
10891
+ // src/program/errors.ts
10892
+ var DeploymentErrorCode = /* @__PURE__ */ ((DeploymentErrorCode2) => {
10893
+ DeploymentErrorCode2["EMPTY_PROGRAM_DATA"] = "EMPTY_PROGRAM_DATA";
10894
+ DeploymentErrorCode2["INVALID_CHUNK_SIZE"] = "INVALID_CHUNK_SIZE";
10895
+ DeploymentErrorCode2["OWNER_MISMATCH"] = "OWNER_MISMATCH";
10896
+ DeploymentErrorCode2["TRANSACTION_FAILED"] = "TRANSACTION_FAILED";
10897
+ DeploymentErrorCode2["TRANSACTION_TIMEOUT"] = "TRANSACTION_TIMEOUT";
10898
+ DeploymentErrorCode2["RPC_ERROR"] = "RPC_ERROR";
10899
+ DeploymentErrorCode2["BUFFER_NOT_READY"] = "BUFFER_NOT_READY";
10900
+ return DeploymentErrorCode2;
10901
+ })(DeploymentErrorCode || {});
10902
+ var DeploymentError = class _DeploymentError extends Error {
10903
+ constructor(code, message, details) {
10904
+ super(message);
10905
+ this.code = code;
10906
+ this.details = details;
10907
+ this.name = "DeploymentError";
10908
+ }
10909
+ static emptyProgramData() {
10910
+ return new _DeploymentError(
10911
+ "EMPTY_PROGRAM_DATA" /* EMPTY_PROGRAM_DATA */,
10912
+ "Program data must not be empty."
10913
+ );
10914
+ }
10915
+ static invalidChunkSize(chunkSize) {
10916
+ return new _DeploymentError(
10917
+ "INVALID_CHUNK_SIZE" /* INVALID_CHUNK_SIZE */,
10918
+ `chunkSize must be greater than 0, got ${chunkSize}.`,
10919
+ { chunkSize }
10920
+ );
10921
+ }
10922
+ static ownerMismatch(owner) {
10923
+ return new _DeploymentError(
10924
+ "OWNER_MISMATCH" /* OWNER_MISMATCH */,
10925
+ `Existing account is not owned by RISC-V Loader (owner: ${owner}).`,
10926
+ { owner }
10927
+ );
10928
+ }
10929
+ static transactionFailed(err2, details) {
10930
+ return new _DeploymentError(
10931
+ "TRANSACTION_FAILED" /* TRANSACTION_FAILED */,
10932
+ `Transaction failed: ${err2}`,
10933
+ details
10934
+ );
10935
+ }
10936
+ static transactionTimeout(message, details) {
10937
+ return new _DeploymentError(
10938
+ "TRANSACTION_TIMEOUT" /* TRANSACTION_TIMEOUT */,
10939
+ `Transaction confirmation timed out: ${message}`,
10940
+ details
10941
+ );
10942
+ }
10943
+ static rpcError(message, details) {
10944
+ return new _DeploymentError(
10945
+ "RPC_ERROR" /* RPC_ERROR */,
10946
+ `RPC error during deployment: ${message}`,
10947
+ details
10948
+ );
10949
+ }
10950
+ static bufferNotReady(maxRetries) {
10951
+ return new _DeploymentError(
10952
+ "BUFFER_NOT_READY" /* BUFFER_NOT_READY */,
10953
+ `Buffer account not ready after ${maxRetries} attempts.`,
10954
+ { maxRetries }
10955
+ );
10956
+ }
10957
+ toJSON() {
10958
+ return {
10959
+ code: this.code,
10960
+ message: this.message,
10961
+ details: this.details
10962
+ };
10963
+ }
10964
+ };
10965
+
10966
+ // src/program/instructions.ts
10967
+ var RiscVLoaderInstruction = /* @__PURE__ */ ((RiscVLoaderInstruction2) => {
10968
+ RiscVLoaderInstruction2[RiscVLoaderInstruction2["Write"] = 0] = "Write";
10969
+ RiscVLoaderInstruction2[RiscVLoaderInstruction2["Copy"] = 1] = "Copy";
10970
+ RiscVLoaderInstruction2[RiscVLoaderInstruction2["SetProgramLength"] = 2] = "SetProgramLength";
10971
+ RiscVLoaderInstruction2[RiscVLoaderInstruction2["Deploy"] = 3] = "Deploy";
10972
+ RiscVLoaderInstruction2[RiscVLoaderInstruction2["Retract"] = 4] = "Retract";
10973
+ RiscVLoaderInstruction2[RiscVLoaderInstruction2["TransferAuthority"] = 5] = "TransferAuthority";
10974
+ RiscVLoaderInstruction2[RiscVLoaderInstruction2["Finalize"] = 6] = "Finalize";
10975
+ return RiscVLoaderInstruction2;
10976
+ })(RiscVLoaderInstruction || {});
10977
+ var LOADER_PROGRAM_ID = PublicKey.fromString(RISCV_LOADER_PROGRAM_ID);
10978
+ function writeInstruction(programAddress, authority, offset, bytes2) {
10979
+ const writer = new BincodeWriter(4 + 4 + 8 + bytes2.length);
10980
+ writer.writeVariant(0 /* Write */);
10981
+ writer.writeU32(offset);
10982
+ writer.writeVecBytes(bytes2);
10983
+ return {
10984
+ programId: LOADER_PROGRAM_ID,
10985
+ accounts: [
10986
+ { pubkey: programAddress, isSigner: false, isWritable: true },
10987
+ { pubkey: authority, isSigner: true, isWritable: false }
10988
+ ],
10989
+ data: writer.toBytes()
10990
+ };
10991
+ }
10992
+ function setProgramLengthInstruction(programAddress, authority, newSize, recipientAddress) {
10993
+ const writer = new BincodeWriter(8);
10994
+ writer.writeVariant(2 /* SetProgramLength */);
10995
+ writer.writeU32(newSize);
10996
+ return {
10997
+ programId: LOADER_PROGRAM_ID,
10998
+ accounts: [
10999
+ { pubkey: programAddress, isSigner: false, isWritable: true },
11000
+ { pubkey: authority, isSigner: true, isWritable: false },
11001
+ { pubkey: recipientAddress, isSigner: false, isWritable: true }
11002
+ ],
11003
+ data: writer.toBytes()
11004
+ };
11005
+ }
11006
+ function deployInstruction(programAddress, authority) {
11007
+ const writer = new BincodeWriter(4);
11008
+ writer.writeVariant(3 /* Deploy */);
11009
+ return {
11010
+ programId: LOADER_PROGRAM_ID,
11011
+ accounts: [
11012
+ { pubkey: programAddress, isSigner: false, isWritable: true },
11013
+ { pubkey: authority, isSigner: true, isWritable: false }
11014
+ ],
11015
+ data: writer.toBytes()
11016
+ };
11017
+ }
11018
+ function retractInstruction(programAddress, authority) {
11019
+ const writer = new BincodeWriter(4);
11020
+ writer.writeVariant(4 /* Retract */);
11021
+ return {
11022
+ programId: LOADER_PROGRAM_ID,
11023
+ accounts: [
11024
+ { pubkey: programAddress, isSigner: false, isWritable: true },
11025
+ { pubkey: authority, isSigner: true, isWritable: false }
11026
+ ],
11027
+ data: writer.toBytes()
11028
+ };
11029
+ }
11030
+
11031
+ // src/program/deployment.ts
11032
+ function calculateBackoff2(attempt, baseDelayMs, maxDelayMs) {
11033
+ const delay = baseDelayMs * 1.15 ** attempt;
11034
+ return Math.min(delay, maxDelayMs);
11035
+ }
11036
+ var ProgramDeployment = class {
11037
+ programData;
11038
+ programKeypair;
11039
+ chunkSize;
11040
+ maxRetries;
11041
+ retryBaseDelayMs;
11042
+ retryMaxDelayMs;
11043
+ confirmationBatchSize;
11044
+ constructor(options) {
11045
+ if (options.programData.length === 0) {
11046
+ throw DeploymentError.emptyProgramData();
11047
+ }
11048
+ this.programData = options.programData;
11049
+ this.programKeypair = options.programKeypair;
11050
+ const chunkSize = options.config?.chunkSize ?? DEFAULT_CHUNK_SIZE;
11051
+ if (chunkSize <= 0) {
11052
+ throw DeploymentError.invalidChunkSize(chunkSize);
11053
+ }
11054
+ this.chunkSize = chunkSize;
11055
+ this.maxRetries = options.config?.maxRetries ?? DEFAULT_MAX_RETRIES2;
11056
+ this.retryBaseDelayMs = options.config?.retryBaseDelayMs ?? DEFAULT_RETRY_BASE_DELAY_MS;
11057
+ this.retryMaxDelayMs = options.config?.retryMaxDelayMs ?? DEFAULT_RETRY_MAX_DELAY_MS;
11058
+ this.confirmationBatchSize = options.config?.confirmationBatchSize ?? DEFAULT_CONFIRMATION_BATCH_SIZE;
11059
+ }
11060
+ /**
11061
+ * Deploy the program to the blockchain.
11062
+ *
11063
+ * @param client - RPC client
11064
+ * @param payerKeypair - Keypair that pays for transactions and becomes the program authority
11065
+ * @returns The program's public key (derived from programKeypair)
11066
+ */
11067
+ async deploy(client, payerKeypair) {
11068
+ const programPubkey = this.programKeypair.publicKey;
11069
+ const payerPubkey = payerKeypair.publicKey;
11070
+ const loaderPubkey = PublicKey.fromString(RISCV_LOADER_PROGRAM_ID);
11071
+ const configHashPrefix = await client.getConfigHashPrefix();
11072
+ const rentExempt = await client.getMinimumBalanceForRentExemption(
11073
+ BigInt(PROGRAM_DATA_OFFSET + this.programData.length)
11074
+ );
11075
+ const bufferBalance = BigInt(Math.floor(Number(rentExempt) * BUFFER_BALANCE_FACTOR));
11076
+ const validFrom = BigInt(Date.now());
11077
+ const existing = await client.getAccountInfo(programPubkey).catch((e) => {
11078
+ if (e instanceof Error && e.message.startsWith("Account does not exist")) {
11079
+ return null;
11080
+ }
11081
+ throw e;
11082
+ });
11083
+ if (existing) {
11084
+ if (existing.owner.toString() !== RISCV_LOADER_PROGRAM_ID) {
11085
+ throw DeploymentError.ownerMismatch(existing.owner.toString());
11086
+ }
11087
+ const ixs = [];
11088
+ if (existing.kelvin < bufferBalance) {
11089
+ const deficit = bufferBalance - existing.kelvin;
11090
+ ixs.push(transferInstruction(payerPubkey, programPubkey, deficit));
11091
+ }
11092
+ if (existing.executable) {
11093
+ ixs.push(retractInstruction(programPubkey, payerPubkey));
11094
+ }
11095
+ ixs.push(
11096
+ setProgramLengthInstruction(
11097
+ programPubkey,
11098
+ payerPubkey,
11099
+ this.programData.length,
11100
+ payerPubkey
11101
+ )
11102
+ );
11103
+ const builder = TransactionBuilder.create().setPayer(payerPubkey).setValidFrom(validFrom).setConfigHashPrefix(configHashPrefix);
11104
+ for (const ix of ixs) {
11105
+ builder.addInstruction(ix);
11106
+ }
11107
+ const tx = builder.build().sign(payerKeypair);
11108
+ await this.sendAndConfirm(client, tx.serialize());
11109
+ } else {
11110
+ const createIx = createAccount(
11111
+ payerPubkey,
11112
+ programPubkey,
11113
+ bufferBalance,
11114
+ 0n,
11115
+ // space=0, the loader manages sizing via SetProgramLength
11116
+ loaderPubkey
11117
+ );
11118
+ const setLengthIx = setProgramLengthInstruction(
11119
+ programPubkey,
11120
+ payerPubkey,
11121
+ this.programData.length,
11122
+ payerPubkey
11123
+ );
11124
+ const tx = TransactionBuilder.create().setPayer(payerPubkey).setValidFrom(validFrom).setConfigHashPrefix(configHashPrefix).addInstruction(createIx).addInstruction(setLengthIx).build().signAll([payerKeypair, this.programKeypair]);
11125
+ await this.sendAndConfirm(client, tx.serialize());
11126
+ }
11127
+ await this.waitForBufferReady(client, programPubkey);
11128
+ const chunks = this.splitIntoChunks(this.programData);
11129
+ const batchSignatures = [];
11130
+ for (let i = 0; i < chunks.length; i++) {
11131
+ const offset = i * this.chunkSize;
11132
+ const ix = writeInstruction(programPubkey, payerPubkey, offset, chunks[i]);
11133
+ const chunkValidFrom = BigInt(Date.now());
11134
+ const tx = TransactionBuilder.create().setPayer(payerPubkey).setValidFrom(chunkValidFrom).setConfigHashPrefix(configHashPrefix).addInstruction(ix).build().sign(payerKeypair);
11135
+ let sig;
11136
+ try {
11137
+ sig = await client.sendTransaction(tx.serialize());
11138
+ } catch (e) {
11139
+ throw this.toDeploymentError(e);
11140
+ }
11141
+ batchSignatures.push(base58.encode(sig));
11142
+ const isBatchComplete = batchSignatures.length >= this.confirmationBatchSize;
11143
+ const isLastChunk = i === chunks.length - 1;
11144
+ if (isBatchComplete || isLastChunk) {
11145
+ await this.confirmBatch(client, batchSignatures);
11146
+ batchSignatures.length = 0;
11147
+ }
11148
+ }
11149
+ const deployIx = deployInstruction(programPubkey, payerPubkey);
11150
+ const deployValidFrom = BigInt(Date.now());
11151
+ const deployTx = TransactionBuilder.create().setPayer(payerPubkey).setValidFrom(deployValidFrom).setConfigHashPrefix(configHashPrefix).addInstruction(deployIx).build().sign(payerKeypair);
11152
+ await this.sendAndConfirm(client, deployTx.serialize());
11153
+ return programPubkey;
11154
+ }
11155
+ splitIntoChunks(data) {
11156
+ const chunks = [];
11157
+ for (let offset = 0; offset < data.length; offset += this.chunkSize) {
11158
+ chunks.push(data.subarray(offset, offset + this.chunkSize));
11159
+ }
11160
+ return chunks;
11161
+ }
11162
+ async sendAndConfirm(client, transaction) {
11163
+ let result;
11164
+ try {
11165
+ result = await client.sendAndConfirmTransaction(transaction, {
11166
+ confirmMaxRetries: this.maxRetries,
11167
+ confirmRetryDelayMs: this.retryBaseDelayMs
11168
+ });
11169
+ } catch (e) {
11170
+ throw this.toDeploymentError(e);
11171
+ }
11172
+ if (!result.executed) {
11173
+ throw DeploymentError.transactionFailed(result.err ?? "unknown error");
11174
+ }
11175
+ }
11176
+ async confirmBatch(client, signatures) {
11177
+ let results;
11178
+ try {
11179
+ results = await Promise.all(
11180
+ signatures.map((sig) => client.confirmTransaction(sig, {
11181
+ maxRetries: this.maxRetries,
11182
+ retryDelayMs: this.retryBaseDelayMs
11183
+ }))
11184
+ );
11185
+ } catch (e) {
11186
+ throw this.toDeploymentError(e);
11187
+ }
11188
+ for (const result of results) {
11189
+ if (!result.executed) {
11190
+ throw DeploymentError.transactionFailed(result.err ?? "unknown error", {
11191
+ signature: result.signature
11192
+ });
11193
+ }
11194
+ }
11195
+ }
11196
+ toDeploymentError(e) {
11197
+ if (e instanceof DeploymentError) return e;
11198
+ if (e instanceof RpcError) {
11199
+ const details = { rpcCode: e.code, retryable: e.retryable, ...e.details };
11200
+ switch (e.code) {
11201
+ case "TRANSACTION_CONFIRMATION_TIMEOUT" /* TRANSACTION_CONFIRMATION_TIMEOUT */:
11202
+ return DeploymentError.transactionTimeout(e.message, details);
11203
+ case "TRANSACTION_REJECTED" /* TRANSACTION_REJECTED */:
11204
+ case "INSUFFICIENT_FUNDS" /* INSUFFICIENT_FUNDS */:
11205
+ return DeploymentError.transactionFailed(e.message, details);
11206
+ default:
11207
+ return DeploymentError.rpcError(e.message, details);
11208
+ }
11209
+ }
11210
+ const message = e instanceof Error ? e.message : String(e);
11211
+ return DeploymentError.rpcError(message, {
11212
+ cause: e instanceof Error ? e.constructor.name : void 0
11213
+ });
11214
+ }
11215
+ async waitForBufferReady(client, programPubkey) {
11216
+ const expectedSize = PROGRAM_DATA_OFFSET + this.programData.length;
11217
+ for (let attempt = 0; attempt < this.maxRetries; attempt++) {
11218
+ try {
11219
+ const account = await client.getAccountInfo(programPubkey);
11220
+ if (account.owner.toString() === RISCV_LOADER_PROGRAM_ID && account.space >= BigInt(expectedSize)) {
11221
+ return;
11222
+ }
11223
+ } catch (e) {
11224
+ if (!(e instanceof Error && e.message.startsWith("Account does not exist"))) {
11225
+ throw e;
11226
+ }
11227
+ }
11228
+ const delay = calculateBackoff2(attempt, this.retryBaseDelayMs, this.retryMaxDelayMs);
11229
+ await sleep(delay);
11230
+ }
11231
+ throw DeploymentError.bufferNotReady(this.maxRetries);
11232
+ }
11233
+ };
10876
11234
  /*! Bundled license information:
10877
11235
 
10878
11236
  @scure/base/index.js:
@@ -10889,6 +11247,6 @@ var KeypairSigner = class {
10889
11247
  (*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) *)
10890
11248
  */
10891
11249
 
10892
- export { AccountMetaTable, BASE_DERIVATION_PATH, BaseRpcClient, BincodeReader, BincodeWriter, CHACHA20_POLY1305_TAG_LENGTH, CryptoError, CryptoErrorCode, DEFAULT_NUM_ACCOUNTS, ED25519_PUBLIC_KEY_LENGTH, HPKE_ENC_LENGTH, HPKE_OVERHEAD_LENGTH, HpkeError, HpkeErrorCode, HttpTransport, KELVIN_PER_RLO, Keypair, KeypairSigner, Message, Mnemonic, PUBLIC_KEY_LENGTH, PublicKey, QueryRpcClient, RIALO_DEVNET_CHAIN, RIALO_LOCALNET_CHAIN, RIALO_MAINNET_CHAIN, RIALO_TESTNET_CHAIN, RexValue, RexValueVariant, RialoClient, RialoError, RialoErrorType, RpcError, RpcErrorCode, SECRET_KEY_LENGTH, SECRET_SHARING_HPKE_INFO, SIGNATURE_LENGTH, SYSTEM_PROGRAM_ID, Schema, Signature, SystemInstruction, Transaction, TransactionBuilder, TransactionError, TransactionErrorCode, TransactionRpcClient, URL_DEVNET, URL_LOCALNET, URL_MAINNET, URL_TESTNET, USER_SECRET_AAD, X25519_PUBLIC_KEY_LENGTH, allocateInstruction, assignInstruction, calculateBackoff, concatBytes2 as concatBytes, createAccount, createBorshInstruction, createRialoClient, deserialize, deserializeBorsh, deserializeCompactU162 as deserializeCompactU16, deserializeStrict, encodeBorshData, encryptForRex, field, fixedArray, fromBase64, getCiphertextLength, getDefaultRialoClientConfig, getDevnetUrl, getLocalnetUrl, getMainnetUrl, getTestnetUrl, hpkeEncrypt, isOnCurve, isValidCiphertextLength, option, seedToBytes, serialize, serializeBorsh, serializeCompactU16, sleep, toBase64, transferInstruction, vec, writeCompactU16 };
11250
+ export { AccountMetaTable, BASE_DERIVATION_PATH, BUFFER_BALANCE_FACTOR, BaseRpcClient, BincodeReader, BincodeWriter, CHACHA20_POLY1305_TAG_LENGTH, CryptoError, CryptoErrorCode, DEFAULT_CHUNK_SIZE, DEFAULT_CONFIRMATION_BATCH_SIZE, DEFAULT_MAX_RETRIES2 as DEFAULT_MAX_RETRIES, DEFAULT_NUM_ACCOUNTS, DEFAULT_RETRY_BASE_DELAY_MS, DEFAULT_RETRY_MAX_DELAY_MS, DeploymentError, DeploymentErrorCode, ED25519_PUBLIC_KEY_LENGTH, HPKE_ENC_LENGTH, HPKE_OVERHEAD_LENGTH, HpkeError, HpkeErrorCode, HttpTransport, KELVIN_PER_RLO, Keypair, KeypairSigner, LOADER_V4_PROGRAM_ID, Message, Mnemonic, PROGRAM_DATA_OFFSET, PUBLIC_KEY_LENGTH, ProgramDeployment, PublicKey, QueryRpcClient, RIALO_DEVNET_CHAIN, RIALO_LOCALNET_CHAIN, RIALO_MAINNET_CHAIN, RIALO_TESTNET_CHAIN, RISCV_LOADER_PROGRAM_ID, RexValue, RexValueVariant, RialoClient, RialoError, RialoErrorType, RiscVLoaderInstruction, RpcError, RpcErrorCode, SECRET_KEY_LENGTH, SECRET_SHARING_HPKE_INFO, SIGNATURE_LENGTH, SYSTEM_PROGRAM_ID, Schema, Signature, SystemInstruction, Transaction, TransactionBuilder, TransactionError, TransactionErrorCode, TransactionRpcClient, URL_DEVNET, URL_LOCALNET, URL_MAINNET, URL_TESTNET, USER_SECRET_AAD, X25519_PUBLIC_KEY_LENGTH, allocateInstruction, assignInstruction, calculateBackoff, concatBytes2 as concatBytes, createAccount, createBorshInstruction, createRialoClient, deployInstruction, deserialize, deserializeBorsh, deserializeCompactU162 as deserializeCompactU16, deserializeStrict, encodeBorshData, encryptForRex, field, fixedArray, fromBase64, getCiphertextLength, getDefaultRialoClientConfig, getDevnetUrl, getLocalnetUrl, getMainnetUrl, getTestnetUrl, hpkeEncrypt, isOnCurve, isValidCiphertextLength, option, retractInstruction, seedToBytes, serialize, serializeBorsh, serializeCompactU16, setProgramLengthInstruction, sleep, toBase64, transferInstruction, vec, writeCompactU16, writeInstruction };
10893
11251
  //# sourceMappingURL=index.mjs.map
10894
11252
  //# sourceMappingURL=index.mjs.map