{"version":3,"sources":["../src/utils/index.ts","../src/utils/util.ts","../src/param/abi.ts","../src/param/constant.ts","../src/param/bytecode.ts","../src/utils/blobs.ts","../src/utils/uploader.ts","../src/utils/web3.ts","../src/ethstorage.ts","../src/flatdirectory.ts"],"sourcesContent":["export * from './util';\nexport * from './blobs';\nexport * from './uploader';\nexport * from './web3';\n","import { ethers } from \"ethers\";\nimport { ContentLike, BufferLike, FileLike, TxCost } from \"../param\";\n\nexport const stringToHex = (s: string): string => ethers.hexlify(ethers.toUtf8Bytes(s));\n\nexport async function getChainId(rpc: string): Promise<number> {\n    const provider = new ethers.JsonRpcProvider(rpc);\n    const network = await provider.getNetwork();\n    return Number(network.chainId);\n}\n\nexport async function getContentChunk(content: ContentLike, start: number, end: number) {\n    if (isBuffer(content)) {\n        return content.slice(start, Math.min(end, content.length));\n    } else {\n        const slice = content.slice(start, Math.min(end, content.size));\n        const data = await slice.arrayBuffer();\n        return new Uint8Array(data);\n    }\n}\n\nexport function isBuffer(content: ContentLike): content is BufferLike {\n    return content instanceof Uint8Array;\n}\n\nexport function isFile(content: ContentLike): content is FileLike {\n    if (isNodejs()) {\n        return content && typeof content === 'object' &&\n            typeof (content as any).isNodeJs === 'boolean' &&\n            (content as any).isNodeJs;\n    } else {\n        return content instanceof File;\n    }\n}\n\nexport function isNodejs(): boolean {\n    return typeof process !== 'undefined' && !!process.versions && !!process.versions.node;\n}\n\nexport function computeVersionedCommitmentHash(commitment: Uint8Array): Uint8Array {\n    const computedVersionedHash = new Uint8Array(32);\n    computedVersionedHash.set([0x01], 0);\n    const hash = ethers.getBytes(ethers.sha256(commitment));\n    computedVersionedHash.set(hash.subarray(1), 1);\n    return computedVersionedHash;\n}\n\nexport function convertToEthStorageHash(commitment: Uint8Array): string {\n    const localHash = computeVersionedCommitmentHash(commitment);\n    const hash = new Uint8Array(32);\n    hash.set(localHash.subarray(0, 32 - 8));\n    return ethers.hexlify(hash);\n}\n\nexport function convertToEthStorageHashes(commitments: Uint8Array[]): string[] {\n    return commitments.map(commitment => convertToEthStorageHash(commitment));\n}\n\nexport async function retry<T>(fn: (...args: any[]) => Promise<T>, retries: number, ...args: any[]): Promise<T> {\n    for (let i = 0; i < retries; i++) {\n        try {\n            return await fn(...args);\n        } catch (error) {\n            if (i === retries - 1) {\n                throw error;\n            }\n        }\n    }\n    throw new Error('Function failed after maximum retries');\n}\n\nexport function copy(des: Uint8Array, desOff: number, src: Uint8Array, srcOff: number): number {\n    const srcLength = src.length - srcOff;\n    const desLength = des.length - desOff;\n    const length = Math.min(srcLength, desLength);\n    des.set(src.subarray(srcOff, srcOff + length), desOff);\n    return length;\n}\n\nexport function calcTxCost(receipt: ethers.TransactionReceipt | null): TxCost {\n    if (!receipt) {\n        return { normalGasCost: 0n, blobGasCost: 0n };\n    }\n\n    // gas cost\n    const normalGasCost: bigint = receipt.gasUsed * receipt.gasPrice;\n    // blob gas cost\n    const blobGasCost: bigint = receipt.blobGasUsed && receipt.blobGasPrice\n        ? BigInt(receipt.blobGasUsed) * BigInt(receipt.blobGasPrice)\n        : 0n;\n    return {\n        normalGasCost,\n        blobGasCost,\n    };\n}\n","\nexport const EthStorageAbi: readonly string[] = [\n  'function putBlobs(bytes32[] memory _keys, uint256[] memory _blobIdxs, uint256[] memory _lengths)',\n  'function putBlob(bytes32 _key, uint256 _blobIdx, uint256 _length) public payable',\n  'function get(bytes32 _key, uint8 _decodeType, uint256 _off, uint256 _len) public view returns (bytes memory)',\n  'function size(bytes32 _key) public view returns (uint256)',\n  'function upfrontPayment() public view returns (uint256)'\n];\n\nexport const FlatDirectoryAbi: readonly string[] = [\n  \"constructor(uint8 slotLimit, uint32 maxChunkSize, address storageAddress) public\",\n  \"function version() external view returns (string)\",\n  \"function isSupportBlob() view external returns (bool)\",\n  \"function setDefault(bytes memory _defaultFile) external\",\n  \"function getChunkHash(bytes memory name, uint256 chunkId) public view returns (bytes32)\",\n  \"function writeChunkByCalldata(bytes memory name, uint256 chunkId, bytes calldata data) external payable\",\n  \"function writeChunksByBlobs(bytes memory name, uint256[] memory chunkIds, uint256[] memory sizes) external payable\",\n  \"function remove(bytes memory name) external returns (uint256)\",\n  \"function truncate(bytes memory name, uint256 chunkId) external returns (uint256)\",\n\n  \"function readChunk(bytes memory name, uint256 chunkId) external view returns (bytes memory, bool)\",\n  \"function readChunksPaged(bytes memory name, uint256 startChunkId, uint256 limit) external view returns (bytes[] memory chunks)\",\n  \"function countChunks(bytes memory name) external view returns (uint256)\",\n  \"function getUploadInfo(bytes memory name) external view returns (uint8 mode, uint256 chunkCount, uint256 storageCost)\",\n  \"function getChunkHashesBatch((bytes,uint256[])[] memory fileChunks) external view returns (bytes32[] memory)\",\n  \"function getChunkCountsBatch(bytes[] memory names) external view returns (uint256[] memory)\"\n];\n","\nconst MAINNET_CHAIN_ID: number = 1;\nconst SEPOLIA_CHAIN_ID: number = 11155111;\nconst QUARKCHAIN_L2_TESTNET_CHAIN_ID: number = 3335;\n\nexport const ETHSTORAGE_MAPPING: Record<number, string> = {\n    [MAINNET_CHAIN_ID]: '0xf0193d6E8fc186e77b6E63af4151db07524f6a7A',\n    [SEPOLIA_CHAIN_ID]: '0xAb3d380A268d088BA21Eb313c1C23F3BEC5cfe93',\n    [QUARKCHAIN_L2_TESTNET_CHAIN_ID]: '0x64003adbdf3014f7E38FC6BE752EB047b95da89A',\n};\n\n\n\nconst BlobTxBytesPerFieldElement: number = 32;      // Size in bytes of a field element\nconst BlobTxFieldElementsPerBlob: number = 4096;\nexport const BLOB_SIZE: number = BlobTxBytesPerFieldElement * BlobTxFieldElementsPerBlob;\n\nexport const OP_BLOB_DATA_SIZE: number = (4 * 31 + 3) * 1024 - 4;\n\n\n// DecodeType\nexport enum DecodeType {\n    RawData,\n    PaddingPer31Bytes,\n    OptimismCompact,\n}\n\nexport const BLOB_COUNT_LIMIT: number = 6;\nexport const MAX_BLOB_COUNT: number = 3;\n\n\nexport enum UploadType {\n    Undefined,\n    Calldata,\n    Blob,\n}\n\n\nexport const MAX_RETRIES: number = 3;\n\n/**\n * eth_call consumes gas, so we need to estimate the maximum number of chunks based on a 30 million gas limit.\n * Additionally, we need to reserve a portion of the gas for the cost of the request parameters (which can vary dynamically).\n */\nexport const MAX_CHUNKS: number = 120;\n\n\n// Randomly generated fixed hash for testing purposes\nexport const DUMMY_VERSIONED_COMMITMENT_HASH = '0x01f32ebe6ad26adca597cdb198f041f5d96fc197e3de72e299e86fbf1f5817c8';\n","\n// Contract bytecode\n// contracts/examples/FlatDirectory.sol\n\n// sol: 0.8.18, evm: london, code: https://github.com/ethstorage/evm-large-storage/commit/8d2feeb4c6697dee7ba2b8a0bd6504b85fc179dd old 1\n\n// sol: 0.8.27, evm: london, code: https://github.com/ethstorage/evm-large-storage/commit/ac89782cecbff79ef6cf3263b5eb27286fbfa877 old 2\n\n// sol: 0.8.29, evm: cancun, code: https://github.com/ethstorage/evm-large-storage/commit/e43bf61c9a779cca8ee6a4a005e22e2dddde18cb\n\n// sol: 0.8.20, evm: cancun, code: https://github.com/ethstorage/evm-large-storage/commit/1619d941d2db691e04392f2796216126033f949a\n\n// sol: 0.8.25, evm: cancun, code: https://github.com/ethstorage/evm-large-storage/commit/0e0969abf18c4ada8ff63e6f0f0a885e15280995\n\n// sol: 0.8.20, evm: cancun, code: https://github.com/ethstorage/evm-large-storage/commit/05edb096616e380d0c55f9e46319428882989f6b\nexport const FlatDirectoryBytecode: string =  \"0x60c06040525f60a0908152600a90620000199082620001cb565b5034801562000026575f80fd5b5060405162003bb238038062003bb2833981016040819052620000499162000293565b60ff8316608052828282818133806200007b57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200008681620000da565b506004805463ffffffff909316600160a01b0263ffffffff60a01b1990931692909217909155600580546001600160a01b039092166001600160a01b031990921691909117905550620002f9945050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200015457607f821691505b6020821081036200017357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001c6575f81815260208120601f850160051c81016020861015620001a15750805b601f850160051c820191505b81811015620001c257828155600101620001ad565b5050505b505050565b81516001600160401b03811115620001e757620001e76200012b565b620001ff81620001f884546200013f565b8462000179565b602080601f83116001811462000235575f84156200021d5750858301515b5f19600386901b1c1916600185901b178555620001c2565b5f85815260208120601f198616915b82811015620002655788860151825594840194600190910190840162000244565b50858210156200028357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f805f60608486031215620002a6575f80fd5b835160ff81168114620002b7575f80fd5b602085015190935063ffffffff81168114620002d1575f80fd5b60408501519092506001600160a01b0381168114620002ee575f80fd5b809150509250925092565b608051613899620003195f395f818161057801526124ae01526138995ff3fe60806040526004361062000211575f3560e01c8063761ab10e116200011a578063cf86bf9311620000a2578063f14c7ad7116200006c578063f14c7ad71462000850578063f2fde38b1462000867578063f53264ea146200088b578063f916c5b014620008af5762000211565b8063cf86bf9314620007b0578063d84eb56c14620007eb578063dc38b0a2146200080f578063dd473fae14620008335762000211565b8063956a343311620000e4578063956a343314620006fb578063a741f1cb146200071f578063c708dd141462000752578063caf1283614620007765762000211565b8063761ab10e146200063c5780638bf4515c146200066f5780638da5cb5b146200069357806393b7628f14620006b25762000211565b80631ccbc6da116200019e57806354fd4d50116200016857806354fd4d5014620005ae57806358edef4c14620005dd5780635ba1d9e51462000601578063715018a614620006255762000211565b80631ccbc6da146200050857806342216bed146200052e5780634db654f914620005525780634eed7cf114620005695762000211565b8063152a4bb311620001e0578063152a4bb314620004415780631a7237e014620004765780631c5ee10c14620004aa5780631c993ad514620004e45762000211565b8063038cd79f146200038e5780630936286114620003b45780631089f40f14620003e357806311ce02671462000407575b3480156200021d575f80fd5b505f366060808284036200024157505060408051602081019091525f815262000383565b83835f81811062000256576200025662002bca565b9050013560f81c60f81b6001600160f81b031916602f60f81b14620002a257505060408051808201909152600e81526d0d2dcc6dee4e4cac6e840e0c2e8d60931b602082015262000383565b8383620002b160018262002bf2565b818110620002c357620002c362002bca565b909101356001600160f81b031916602f60f81b03905062000325576200031c620002f1846001818862002c08565b600a604051602001620003079392919062002c65565b604051602081830303815290604052620008d3565b50905062000376565b6200037262000338846001818862002c08565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250620008d392505050565b5090505b620003818162000997565b505b915050805190602001f35b3480156200039a575f80fd5b50620003b2620003ac36600462002e1f565b620009ca565b005b348015620003c0575f80fd5b50620003cb620009e7565b604051620003da919062002eda565b60405180910390f35b348015620003ef575f80fd5b50620003b26200040136600462002ef5565b62000a7b565b34801562000413575f80fd5b5060055462000428906001600160a01b031681565b6040516001600160a01b039091168152602001620003da565b3480156200044d575f80fd5b50620004656200045f36600462002f1a565b62000aab565b604051620003da9392919062002f80565b34801562000482575f80fd5b506200049a6200049436600462002fa3565b62000b5e565b604051620003da92919062002fe8565b348015620004b6575f80fd5b50620004ce620004c836600462002f1a565b62000c09565b60408051928352602083019190915201620003da565b348015620004f0575f80fd5b50620003b26200050236600462002f1a565b62000cad565b34801562000514575f80fd5b506200051f62000cc9565b604051908152602001620003da565b3480156200053a575f80fd5b506200051f6200054c36600462002fa3565b62000d3c565b620003b2620005633660046200309c565b62000dd5565b34801562000575575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000060ff1615155b6040519015158152602001620003da565b348015620005ba575f80fd5b506040805180820190915260058152640312e312e360dc1b6020820152620003cb565b348015620005e9575f80fd5b506200051f620005fb36600462002f1a565b62000f39565b3480156200060d575f80fd5b506200059d6200061f36600462002fa3565b62000fcc565b34801562000631575f80fd5b50620003b26200104f565b34801562000648575f80fd5b50620006606200065a36600462003127565b62001066565b604051620003da919062003174565b3480156200067b575f80fd5b506200049a6200068d36600462002f1a565b620008d3565b3480156200069f575f80fd5b506004546001600160a01b031662000428565b348015620006be575f80fd5b50620006ec620006d036600462002f1a565b80516020918201205f9081526009909152604090205460ff1690565b604051620003da9190620031d8565b34801562000707575f80fd5b506200051f62000719366004620031ed565b62001215565b3480156200072b575f80fd5b50620007436200073d3660046200320e565b620012b5565b604051620003da9190620032c4565b3480156200075e575f80fd5b50620007436200077036600462003309565b62001370565b34801562000782575f80fd5b506200079a6200079436600462002fa3565b62001514565b60408051928352901515602083015201620003da565b348015620007bc575f80fd5b50600454620007d590600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620003da565b348015620007f7575f80fd5b506200051f6200080936600462002fa3565b62001591565b3480156200081b575f80fd5b50620003b26200082d36600462003411565b6200160a565b3480156200083f575f80fd5b50651b585b9d585b60d21b6200051f565b3480156200085c575f80fd5b506200059d62001636565b34801562000873575f80fd5b50620003b26200088536600462003411565b62001660565b34801562000897575f80fd5b50620003b2620008a936600462003439565b620016a3565b348015620008bb575f80fd5b506200051f620008cd36600462002f1a565b62001794565b60605f805f620008fe8580516020918201205f8181526009909252604090912054909160ff90911690565b909250905060028160028111156200091a576200091a62002f4f565b0362000936576200092b8262001812565b935093505050915091565b60018160028111156200094d576200094d62002f4f565b036200095e576200092b82620019e9565b5f5b6040519080825280601f01601f1916602001820160405280156200098b576020820181803683370190505b50955f95509350505050565b5f81516040620009a89190620034aa565b9050601f19620009ba82601f620034aa565b1690506020808303528060208303f35b620009d462001b26565b620009e2835f8484620016a3565b505050565b600a8054620009f69062002c31565b80601f016020809104026020016040519081016040528092919081815260200182805462000a249062002c31565b801562000a735780601f1062000a495761010080835404028352916020019162000a73565b820191905f5260205f20905b81548152906001019060200180831162000a5557829003601f168201915b505050505081565b62000a8562001b26565b6004805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80516020808301919091205f8181526009909252604082205460ff16919081906002848181111562000ae15762000ae162002f4f565b0362000afe575f818152600760205260409020545b925062000b33565b600184600281111562000b155762000b1562002f4f565b0362000b2f575f8181526002602052604090205462000af6565b5f92505b6005546001600160a01b031662000b4b575f62000b55565b62000b5562000cc9565b93959294505050565b60605f805f62000b898680516020918201205f8181526009909252604090912054909160ff90911690565b9092509050600281600281111562000ba55762000ba562002f4f565b0362000bc35762000bb7828662001b55565b93509350505062000c02565b600181600281111562000bda5762000bda62002f4f565b0362000bec5762000bb7828662001c2c565b5050604080515f80825260208201909252925090505b9250929050565b80516020808301919091205f8181526009909252604082205482919060ff166002818181111562000c3e5762000c3e62002f4f565b0362000c64575f828152600860209081526040808320546007909252909120546200092b565b600181600281111562000c7b5762000c7b62002f4f565b0362000ca1575f828152600360209081526040808320546002909252909120546200092b565b505f9485945092505050565b62000cb762001b26565b600a62000cc5828262003509565b5050565b60055460408051630e65e36d60e11b815290515f926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562000d11573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000d379190620035d1565b905090565b81516020808401919091205f8181526009909252604082205460ff166002818181111562000d6e5762000d6e62002f4f565b0362000d8a5762000d80828562001215565b9250505062000dcf565b600181600281111562000da15762000da162002f4f565b0362000dc9575f62000db4838662001c2c565b508051602090910120935062000dcf92505050565b505f9150505b92915050565b62000ddf62001b26565b62000de962001636565b62000e545760405162461bcd60e51b815260206004820152603060248201527f5468652063757272656e74206e6574776f726b20646f6573206e6f742073757060448201526f1c1bdc9d08189b1bd8881d5c1b1bd85960821b60648201526084015b60405180910390fd5b82516020808501919091205f81815260099092526040822054909160ff9091169081600281111562000e8a5762000e8a62002f4f565b148062000eab5750600281600281111562000ea95762000ea962002f4f565b145b62000ef05760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b604482015260640162000e4b565b5f81600281111562000f065762000f0662002f4f565b0362000f25575f828152600960205260409020805460ff191660021790555b62000f3282858562001c9f565b5050505050565b5f62000f4462001b26565b81516020808401919091205f81815260099092526040909120805460ff19811690915560ff166002818181111562000f805762000f8062002f4f565b0362000f9a5762000f92825f62001fbc565b949350505050565b600181600281111562000fb15762000fb162002f4f565b0362000fc35762000f92825f620020e9565b505f9392505050565b5f62000fd762001b26565b82516020808501919091205f818152600990925260409091205460ff16600281818111156200100a576200100a62002f4f565b036200101c5762000d8082856200218a565b600181600281111562001033576200103362002f4f565b03620010455762000d808285620022ac565b505f949350505050565b6200105962001b26565b620010645f6200233d565b565b60605f620010748562001794565b90505f620010838486620034aa565b905081811115620010915750805b5f858211620010a1575f620010ad565b620010ad868362002bf2565b90505f80620010d78980516020918201205f8181526009909252604090912054909160ff90911690565b91509150826001600160401b03811115620010f657620010f662002cec565b6040519080825280602002602001820160405280156200112b57816020015b6060815260200190600190039081620011155790505b5095505f5b8381101562001208575f62001146828b620034aa565b905060028360028111156200115f576200115f62002f4f565b03620011985762001171848262001b55565b5088838151811062001187576200118762002bca565b6020026020010181905250620011f2565b6001836002811115620011af57620011af62002f4f565b03620011c15762001171848262001c2c565b604080515f8152602081019091528851899084908110620011e657620011e662002bca565b60200260200101819052505b5080620011ff81620035e9565b91505062001130565b5050505050509392505050565b6005545f83815260066020908152604080832085845290915280822054905163d8389dc560e01b815291926001600160a01b03169163d8389dc591620012619160040190815260200190565b602060405180830381865afa1580156200127d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012a3919062003604565b67ffffffffffffffff19169392505050565b60605f82516001600160401b03811115620012d457620012d462002cec565b604051908082528060200260200182016040528015620012fe578160200160208202803683370190505b5090505f5b835181101562001369576200133484828151811062001326576200132662002bca565b602002602001015162001794565b82828151811062001349576200134962002bca565b6020908102919091010152806200136081620035e9565b91505062001303565b5092915050565b60605f805b8351811015620013c55783818151811062001394576200139462002bca565b6020026020010151602001515182620013ae9190620034aa565b915080620013bc81620035e9565b91505062001375565b505f816001600160401b03811115620013e257620013e262002cec565b6040519080825280602002602001820160405280156200140c578160200160208202803683370190505b5090505f805b85518110156200150a575f5b86828151811062001433576200143362002bca565b60200260200101516020015151811015620014f457620014af87838151811062001461576200146162002bca565b60200260200101515f015188848151811062001481576200148162002bca565b6020026020010151602001518381518110620014a157620014a162002bca565b602002602001015162000d3c565b848481518110620014c457620014c462002bca565b602090810291909101015282620014db81620035e9565b9350508080620014eb90620035e9565b9150506200141e565b50806200150181620035e9565b91505062001412565b5090949350505050565b81516020808401919091205f8181526009909252604082205482919060ff166002818181111562001549576200154962002f4f565b036200155b5762000bb782866200238e565b600181600281111562001572576200157262002f4f565b03620015845762000bb782866200244a565b505f958695509350505050565b5f6200159c62001b26565b82516020808501919091205f818152600990925260409091205460ff1660028181811115620015cf57620015cf62002f4f565b03620015e15762000d80828562001fbc565b6001816002811115620015f857620015f862002f4f565b03620010455762000d808285620020e9565b6200161462001b26565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005545f906001600160a01b03161580159062000d3757505f6200165962000cc9565b1015905090565b6200166a62001b26565b6001600160a01b0381166200169557604051631e4fbdf760e01b81525f600482015260240162000e4b565b620016a0816200233d565b50565b620016ad62001b26565b83516020808601919091205f81815260099092526040822054909160ff90911690816002811115620016e357620016e362002f4f565b1480620017045750600181600281111562001702576200170262002f4f565b145b620017495760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b604482015260640162000e4b565b5f8160028111156200175f576200175f62002f4f565b036200177e575f828152600960205260409020805460ff191660011790555b6200178c828686866200249d565b505050505050565b80516020808301919091205f8181526009909252604082205460ff1660028181811115620017c657620017c662002f4f565b03620017e157505f9081526007602052604090205492915050565b6001816002811115620017f857620017f862002f4f565b0362000fc3575f8281526002602052604090205462000f92565b60605f805f6200183a855f908152600860209081526040808320546007909252909120549091565b91509150805f036200184d575f62000960565b5f826001600160401b0381111562001869576200186962002cec565b6040519080825280601f01601f19166020018201604052801562001894576020820181803683370190505b5090505f805b83811015620019da575f88815260066020908152604080832084845290915280822054600554915163afd5644d60e01b8152600481018290529092916001600160a01b03169063afd5644d90602401602060405180830381865afa15801562001905573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200192b9190620035d1565b60055460405163bea94b8b60e01b81529192506001600160a01b03169063bea94b8b90620019659085906002905f9087906004016200362e565b5f60405180830381865afa15801562001980573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052620019a991908101906200365b565b508060406020868801013e620019c08185620034aa565b935050508080620019d190620035e9565b9150506200189a565b50909660019650945050505050565b60605f805f62001a11855f908152600360209081526040808320546002909252909120549091565b91509150805f0362001a24575f62000960565b5f826001600160401b0381111562001a405762001a4062002cec565b6040519080825280601f01601f19166020018201604052801562001a6b576020820181803683370190505b509050602081015f5b83811015620019da575f888152602081815260408083208484529091528120549062001aa08262002582565b1562001ae15762001ab18260e01c90565b5f8b8152600160209081526040808320878452909152902090915062001ad990838662002596565b505062001b00565b8162001aed8162002646565b50915062001afc81866200266b565b5050505b62001b0c8185620034aa565b93505050808062001b1d90620035e9565b91505062001a74565b6004546001600160a01b03163314620010645760405163118cdaa760e01b815233600482015260240162000e4b565b60605f8062001b6585856200238e565b509050600181101562001b8b575050604080515f80825260208201909252915062000c02565b6005545f86815260066020908152604080832088845290915280822054905163bea94b8b60e01b815291926001600160a01b03169163bea94b8b9162001bdb91600290869088906004016200362e565b5f60405180830381865afa15801562001bf6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262001c1f91908101906200365b565b9660019650945050505050565b5f828152602081815260408083208484529091528120546060919062001c528162002582565b1562001c89575f858152600160209081526040808320878452909152902062001c7c9082620026a3565b6001925092505062000c02565b62001c948162002746565b925092505062000c02565b815160055460408051630e65e36d60e11b815290515f926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562001ce9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001d0f9190620035d1565b905062001d1d8282620036d5565b34101562001d655760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640162000e4b565b5f5b828110156200178c5783818151811062001d855762001d8562002bca565b60200260200101515f10801562001dd05750600460149054906101000a900463ffffffff1663ffffffff1684828151811062001dc55762001dc562002bca565b602002602001015111155b62001e155760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840c6d0eadcd640d8cadccee8d60631b604482015260640162000e4b565b62001e5a8686838151811062001e2f5762001e2f62002bca565b602002602001015186848151811062001e4c5762001e4c62002bca565b6020026020010151620027c5565b5f338787848151811062001e725762001e7262002bca565b602002602001015160405160200162001ea9939291906001600160a01b039390931683526020830191909152604082015260600190565b60405160208183030381529060405280519060200120905060055f9054906101000a90046001600160a01b03166001600160a01b0316634581a92084838589878151811062001efc5762001efc62002bca565b60200260200101516040518563ffffffff1660e01b815260040162001f34939291909283526020830191909152604082015260600190565b5f604051808303818588803b15801562001f4c575f80fd5b505af115801562001f5f573d5f803e3d5ffd5b50505050508060065f8981526020019081526020015f205f88858151811062001f8c5762001f8c62002bca565b602002602001015181526020019081526020015f208190555050808062001fb390620035e9565b91505062001d67565b5f5b5f83815260066020908152604080832085845290915290205415620020e3576005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d91620020299160040190815260200190565b602060405180830381865afa15801562002045573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200206b9190620035d1565b90508060085f8681526020019081526020015f205f8282546200208f919062002bf2565b90915550505f848152600660209081526040808320868452825280832083905586835260079091528120805491620020c783620036ef565b91905055508280620020d990620035e9565b9350505062001fbe565b50919050565b5f5b5f8381526020818152604080832085845290915290205415620020e3575f6200211584846200244a565b505f858152602081815260408083208784528252808320839055878352600290915281208054929350906200214a83620036ef565b90915550505f84815260036020526040812080548392906200216e90849062002bf2565b909155508390506200218081620035e9565b93505050620020eb565b5f82815260076020526040812054620021a69060019062002bf2565b8214620021b557505f62000dcf565b6005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d91620022019160040190815260200190565b602060405180830381865afa1580156200221d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620022439190620035d1565b5f8581526006602090815260408083208784528252808320839055878352600790915281208054929350906200227983620036ef565b90915550505f84815260086020526040812080548392906200229d90849062002bf2565b90915550600195945050505050565b5f82815260026020526040812054620022c89060019062002bf2565b8214620022d757505f62000dcf565b5f620022e484846200244a565b505f858152602081815260408083208784528252808320839055878352600290915281208054929350906200231983620036ef565b90915550505f84815260036020526040812080548392906200229d90849062002bf2565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8281526007602052604081205481908310620023b057505f90508062000c02565b6005545f85815260066020908152604080832087845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d91620023fc9160040190815260200190565b602060405180830381865afa15801562002418573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200243e9190620035d1565b95600195509350505050565b5f8281526020818152604080832084845290915281205481908062002476575f80925092505062000c02565b620024818162002582565b15620024925762001c7c8160e01c90565b62001c948162002646565b620024aa8484836200293c565b60ff7f0000000000000000000000000000000000000000000000000000000000000000168111156200250f57620024f2620024e6838362002a5e565b6001600160a01b031690565b5f858152602081815260408083208784529091529020556200257c565b5f8481526001602090815260408083208684528252918290208251601f85018390048302810183019093528383526200256492909185908590819084018382808284375f9201919091525062002aa092505050565b5f858152602081815260408083208784529091529020555b50505050565b5f806200258f8360e01c90565b1192915050565b5f805f620025a48562002b38565b808652909350905083601c8411156200263857601c81015f805b60206001620025cf601c8a62002bf2565b620025dc906020620034aa565b620025e8919062002bf2565b620025f4919062003707565b81101562002634575f81815260208b815260409091205480855292506200261d908490620034aa565b9250806200262b81620035e9565b915050620025be565b5050505b600192505050935093915050565b5f806001600160a01b0383166200266157505f928392509050565b50503b9081151590565b5f805f806200267a8662002646565b915091508062002692575f8093509350505062000c02565b815f86883c50946001945092505050565b60605f620026b18362002b52565b92509050601c8111156200136957603c82015f805b60206001620026d7601c8762002bf2565b620026e4906020620034aa565b620026f0919062002bf2565b620026fc919062003707565b8110156200273c575f8181526020888152604090912054808552925062002725908490620034aa565b9250806200273381620035e9565b915050620026c6565b5050505092915050565b60605f805f620027568562002646565b915091508062002767575f62000960565b5f826001600160401b0381111562002783576200278362002cec565b6040519080825280601f01601f191660200182016040528015620027ae576020820181803683370190505b509050825f60208301883c95600195509350505050565b5f838152600760205260409020548211156200281d5760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b604482015260640162000e4b565b5f83815260076020526040902054821015620028f2576005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d916200287f9160040190815260200190565b602060405180830381865afa1580156200289b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620028c19190620035d1565b90508060085f8681526020019081526020015f205f828254620028e5919062002bf2565b9091555062002913915050565b5f8381526007602052604081208054916200290d83620035e9565b91905055505b5f838152600860205260408120805483929062002932908490620034aa565b9091555050505050565b5f8381526020818152604080832085845290915290205480620029fb578215806200298e57505f848152602081905260408120816200297d60018762002bf2565b81526020019081526020015f205414155b620029d55760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b604482015260640162000e4b565b5f848152600260205260408120805491620029f083620035e9565b919050555062002a34565b5f62002a0885856200244a565b5090508060035f8781526020019081526020015f205f82825462002a2d919062002bf2565b9091555050505b5f848152600360205260408120805484929062002a53908490620034aa565b909155505050505050565b5f80838360405162002a709062002bbc565b62002a7d92919062003727565b604051809103905ff08015801562002a97573d5f803e3d5ffd5b50949350505050565b805160208083015160e083901b911c1790601c81111562001369575f603c8401815b6020600162002ad3601c8762002bf2565b62002ae0906020620034aa565b62002aec919062002bf2565b62002af8919062003707565b8110156200273c578151925062002b11826020620034aa565b5f82815260208990526040902084905591508062002b2f81620035e9565b91505062002ac2565b5f8062002b458360e01c90565b9360209390931b92915050565b5f606062002b608360e01c90565b9150602083901b9250816001600160401b0381111562002b845762002b8462002cec565b6040519080825280601f01601f19166020018201604052801562002baf576020820181803683370190505b5060208101939093525091565b61010e806200375683390190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111562000dcf5762000dcf62002bde565b5f808585111562002c17575f80fd5b8386111562002c24575f80fd5b5050820193919092039150565b600181811c9082168062002c4657607f821691505b602082108103620020e357634e487b7160e01b5f52602260045260245ffd5b828482375f8382015f81525f845462002c7e8162002c31565b6001828116801562002c99576001811462002caf5762002cdd565b60ff198416865282151583028601945062002cdd565b885f526020805f205f5b8581101562002cd45781548982015290840190820162002cb9565b50505082860194505b50929998505050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171562002d255762002d2562002cec565b60405290565b604051601f8201601f191681016001600160401b038111828210171562002d565762002d5662002cec565b604052919050565b5f6001600160401b0382111562002d795762002d7962002cec565b50601f01601f191660200190565b5f82601f83011262002d97575f80fd5b813562002dae62002da88262002d5e565b62002d2b565b81815284602083860101111562002dc3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8083601f84011262002df0575f80fd5b5081356001600160401b0381111562002e07575f80fd5b60208301915083602082850101111562000c02575f80fd5b5f805f6040848603121562002e32575f80fd5b83356001600160401b038082111562002e49575f80fd5b62002e578783880162002d87565b9450602086013591508082111562002e6d575f80fd5b5062002e7c8682870162002ddf565b9497909650939450505050565b5f5b8381101562002ea557818101518382015260200162002e8b565b50505f910152565b5f815180845262002ec681602086016020860162002e89565b601f01601f19169290920160200192915050565b602081525f62002eee602083018462002ead565b9392505050565b5f6020828403121562002f06575f80fd5b813563ffffffff8116811462002eee575f80fd5b5f6020828403121562002f2b575f80fd5b81356001600160401b0381111562002f41575f80fd5b62000f928482850162002d87565b634e487b7160e01b5f52602160045260245ffd5b60038110620016a057634e487b7160e01b5f52602160045260245ffd5b6060810162002f8f8562002f63565b938152602081019290925260409091015290565b5f806040838503121562002fb5575f80fd5b82356001600160401b0381111562002fcb575f80fd5b62002fd98582860162002d87565b95602094909401359450505050565b604081525f62002ffc604083018562002ead565b905082151560208301529392505050565b5f6001600160401b0382111562003028576200302862002cec565b5060051b60200190565b5f82601f83011262003042575f80fd5b813560206200305562002da8836200300d565b82815260059290921b8401810191818101908684111562003074575f80fd5b8286015b8481101562003091578035835291830191830162003078565b509695505050505050565b5f805f60608486031215620030af575f80fd5b83356001600160401b0380821115620030c6575f80fd5b620030d48783880162002d87565b94506020860135915080821115620030ea575f80fd5b620030f88783880162003032565b935060408601359150808211156200310e575f80fd5b506200311d8682870162003032565b9150509250925092565b5f805f606084860312156200313a575f80fd5b83356001600160401b0381111562003150575f80fd5b6200315e8682870162002d87565b9660208601359650604090950135949350505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b82811015620031cb57603f19888603018452620031b885835162002ead565b9450928501929085019060010162003199565b5092979650505050505050565b60208101620031e78362002f63565b91905290565b5f8060408385031215620031ff575f80fd5b50508035926020909101359150565b5f602080838503121562003220575f80fd5b82356001600160401b038082111562003237575f80fd5b818501915085601f8301126200324b575f80fd5b81356200325c62002da8826200300d565b81815260059190911b830184019084810190888311156200327b575f80fd5b8585015b83811015620032b75780358581111562003298575f8081fd5b620032a88b89838a010162002d87565b8452509186019186016200327f565b5098975050505050505050565b602080825282518282018190525f9190848201906040850190845b81811015620032fd57835183529284019291840191600101620032df565b50909695505050505050565b5f60208083850312156200331b575f80fd5b82356001600160401b038082111562003332575f80fd5b818501915085601f83011262003346575f80fd5b81356200335762002da8826200300d565b81815260059190911b8301840190848101908883111562003376575f80fd5b8585015b83811015620032b75780358581111562003393575f8081fd5b86016040818c03601f1901811315620033ab575f8081fd5b620033b562002d00565b8983013588811115620033c7575f8081fd5b620033d78e8c8387010162002d87565b825250908201359087821115620033ed575f8081fd5b620033fd8d8b8486010162003032565b818b0152855250509186019186016200337a565b5f6020828403121562003422575f80fd5b81356001600160a01b038116811462002eee575f80fd5b5f805f80606085870312156200344d575f80fd5b84356001600160401b038082111562003464575f80fd5b620034728883890162002d87565b95506020870135945060408701359150808211156200348f575f80fd5b506200349e8782880162002ddf565b95989497509550505050565b8082018082111562000dcf5762000dcf62002bde565b601f821115620009e2575f81815260208120601f850160051c81016020861015620034e85750805b601f850160051c820191505b818110156200178c57828155600101620034f4565b81516001600160401b0381111562003525576200352562002cec565b6200353d8162003536845462002c31565b84620034c0565b602080601f83116001811462003573575f84156200355b5750858301515b5f19600386901b1c1916600185901b1785556200178c565b5f85815260208120601f198616915b82811015620035a35788860151825594840194600190910190840162003582565b5085821015620035c157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620035e2575f80fd5b5051919050565b5f60018201620035fd57620035fd62002bde565b5060010190565b5f6020828403121562003615575f80fd5b815167ffffffffffffffff198116811462002eee575f80fd5b84815260808101620036408562002f63565b84602083015283604083015282606083015295945050505050565b5f602082840312156200366c575f80fd5b81516001600160401b0381111562003682575f80fd5b8201601f8101841362003693575f80fd5b8051620036a462002da88262002d5e565b818152856020838501011115620036b9575f80fd5b620036cc82602083016020860162002e89565b95945050505050565b808202811582820484141762000dcf5762000dcf62002bde565b5f8162003700576200370062002bde565b505f190190565b5f826200372257634e487b7160e01b5f52601260045260245ffd5b500490565b60208152816020820152818360408301375f818301604090810191909152601f909201601f1916010191905056fe608060405234801561000f575f80fd5b5060405161010e38038061010e83398101604081905261002e9161004b565b80518060208301f35b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561005c575f80fd5b82516001600160401b0380821115610072575f80fd5b818501915085601f830112610085575f80fd5b81518181111561009757610097610037565b604051601f8201601f19908116603f011681019083821181831017156100bf576100bf610037565b8160405282815288868487010111156100d6575f80fd5b5f93505b828410156100f757848401860151818501870152928501926100da565b5f8684830101528096505050505050509291505056fea2646970667358221220ebcd139e7374a9f1c5b5d7c1230cab1e82cbda5396f436b329517280494c00bb64736f6c63430008140033\";\n\nexport const FLAT_DIRECTORY_CONTRACT_VERSION_1_0_0: string = \"1.0.0\";\nexport const FLAT_DIRECTORY_CONTRACT_VERSION_1_1_0: string = \"1.1.0\";\n","import { copy } from \"./util\";\nimport { BLOB_SIZE } from \"../param\";\n\n// OP BLOB\nconst MaxBlobDataSize = (4 * 31 + 3) * 1024 - 4;\nconst EncodingVersion = 0;\nconst Rounds = 1024; // number of encode/decode rounds\n\nexport function encodeOpBlobs(data: Uint8Array): Uint8Array[] {\n    const len = data.length;\n    if (len === 0) {\n        throw new Error('invalid blob data');\n    }\n    const blobs: Uint8Array[] = [];\n    for (let i = 0; i < len; i += MaxBlobDataSize) {\n        let max = i + MaxBlobDataSize;\n        if (max > len) {\n            max = len;\n        }\n        const blob = encodeOpBlob(data.subarray(i, max));\n        blobs.push(blob);\n    }\n    return blobs;\n}\n\nexport function encodeOpBlob(data: Uint8Array): Uint8Array {\n    if (data.length > MaxBlobDataSize) {\n        throw new Error(`too much data to encode in one blob, len=${data.length}`);\n    }\n\n    const b = new Uint8Array(BLOB_SIZE).fill(0);\n    let readOffset = 0;\n\n    // read 1 byte of input, 0 if there is no input left\n    const read1 = (): number => {\n        if (readOffset >= data.length) {\n            return 0;\n        }\n        const out = data[readOffset];\n        readOffset += 1;\n        return out;\n    }\n\n    let writeOffset = 0;\n    const buf31 = new Uint8Array(31);\n    const zero31 = new Uint8Array(31);\n    // Read up to 31 bytes of input (left-aligned), into buf31.\n    const read31 = (): void => {\n        if (readOffset >= data.length) {\n            copy(buf31, 0, zero31, 0);\n            return;\n        }\n\n        const n = copy(buf31, 0, data, readOffset); // copy as much data as we can\n        copy(buf31, n, zero31, 0);       // pad with zeroes (since there might not be enough data)\n        readOffset += n;\n    }\n    // Write a byte, updates the write-offset.\n    // Asserts that the write-offset matches encoding-algorithm expectations.\n    // Asserts that the value is 6 bits.\n    const write1 = (v: number): void => {\n        if (writeOffset % 32 !== 0) {\n            throw new Error(`blob encoding: invalid byte write offset: ${writeOffset}`);\n        }\n\n        const tag = v & 0b1100_0000;\n        if (tag !== 0) {\n            throw new Error(`blob encoding: invalid 6 bit value: 0b${v.toString(2)}`);\n        }\n        b[writeOffset] = v;\n        writeOffset += 1;\n    }\n    // Write buf31 to the blob, updates the write-offset.\n    // Asserts that the write-offset matches encoding-algorithm expectations.\n    const write31 = (): void => {\n        if (writeOffset % 32 !== 1) {\n            throw new Error(`blob encoding: invalid bytes31 write offset: ${writeOffset}`);\n        }\n\n        copy(b, writeOffset, buf31, 0);\n        writeOffset += 31;\n    }\n\n    for (let round = 0; round < Rounds && readOffset < data.length; round++) {\n        // The first field element encodes the version and the length of the data in [1:5].\n        // This is a manual substitute for read31(), preparing the buf31.\n        if (round === 0) {\n            buf31[0] = EncodingVersion;\n            // Encode the length as big-endian uint24.\n            // The length check at the start above ensures we can always fit the length value into only 3 bytes.\n            const ilen = data.length;\n            buf31[1] = (ilen >> 16) & 0xFF;\n            buf31[2] = (ilen >> 8) & 0xFF;\n            buf31[3] = ilen & 0xFF;\n\n            readOffset += copy(buf31, 4, data, 0);\n        } else {\n            read31();\n        }\n\n        const x = read1();\n        const A = x & 0b0011_1111;\n        write1(A);\n        write31();\n\n        read31();\n        const y = read1();\n        const B = (y & 0b0000_1111) | ((x & 0b1100_0000) >> 2);\n        write1(B);\n        write31();\n\n        read31();\n        const z = read1();\n        const C = z & 0b0011_1111;\n        write1(C);\n        write31();\n\n        read31();\n        const D = ((z & 0b1100_0000) >> 2) | ((y & 0b1111_0000) >> 4);\n        write1(D);\n        write31();\n    }\n\n    if (readOffset < data.length) {\n        throw new Error(`expected to fit data but failed, read offset: ${readOffset}, data: ${data}`);\n    }\n    return b;\n}\n","import { ethers } from \"ethers\";\nimport { Mutex } from 'async-mutex';\nimport { KZG } from \"js-kzg\";\nimport { calcTxCost, computeVersionedCommitmentHash, convertToEthStorageHashes } from \"./util\";\nimport { UploadResult } from \"../param\";\n\nexport class BlobUploader {\n    private readonly provider: ethers.JsonRpcProvider;\n    private readonly wallet: ethers.Wallet;\n    private readonly mutex: Mutex;\n    private readonly kzg: KZG;\n\n    constructor(rpc: string, pk: string) {\n        this.provider = new ethers.JsonRpcProvider(rpc);\n        this.wallet = new ethers.Wallet(pk, this.provider);\n        this.mutex = new Mutex();\n        this.kzg = new KZG();\n    }\n\n    async getBlobGasPrice(): Promise<bigint> {\n        const response = await this.provider.send(\"eth_blobBaseFee\", []);\n        if (!response) {\n            throw new Error(\"eth_blobBaseFee RPC returned empty response\");\n        }\n        return BigInt(response) * 11n / 10n;\n    }\n\n    async getGasPrice(): Promise<ethers.FeeData> {\n        return await this.provider.getFeeData();\n    }\n\n    async sendTx(\n        tx: ethers.TransactionRequest,\n        blobs: Uint8Array[] | null = null,\n        commitments: Uint8Array[] | null = null,\n    ): Promise<ethers.TransactionResponse> {\n        return await this.send(tx, false, blobs, commitments, false);\n    }\n\n    async sendTxLock(\n        tx: ethers.TransactionRequest,\n        isConfirmedNonce: boolean,\n        blobs: Uint8Array[] | null = null,\n        commitments: Uint8Array[] | null = null,\n    ): Promise<ethers.TransactionResponse> {\n        return await this.send(tx, isConfirmedNonce, blobs, commitments, true);\n    }\n\n    private async send(\n        tx: ethers.TransactionRequest,\n        isConfirmedNonce: boolean,\n        blobs: Uint8Array[] | null = null,\n        commitments: Uint8Array[] | null = null,\n        isLock: boolean = false\n    ): Promise<ethers.TransactionResponse> {\n        if (isConfirmedNonce) {\n            tx.nonce = await this.provider.getTransactionCount(this.wallet.address, \"latest\");\n        }\n\n        if (!blobs) {\n            return isLock ? await this.lockSend(tx) : await this.wallet.sendTransaction(tx);\n        }\n\n        // blobs\n        const fullCommitments = commitments && commitments.length === blobs.length\n            ? commitments\n            : await this.kzg.computeCommitmentBatch(blobs);\n        const proofs = await this.kzg.computeProofBatch(blobs, fullCommitments);\n\n        const ethersBlobs: ethers.BlobLike[] = blobs.map((blob, i) => ({\n            data: blob,\n            proof: proofs[i],\n            commitment: fullCommitments[i]\n        }));\n\n        const versionedHashes = fullCommitments.map(commitment =>\n            ethers.hexlify(computeVersionedCommitmentHash(commitment))\n        );\n\n        tx.maxFeePerBlobGas ??= await this.getBlobGasPrice();\n\n        // send\n        tx.type = 3;\n        tx.blobVersionedHashes = versionedHashes;\n        tx.blobs = ethersBlobs;\n        return isLock ? await this.lockSend(tx) : await this.wallet.sendTransaction(tx);\n    }\n\n    private async lockSend(tx: ethers.TransactionRequest): Promise<ethers.TransactionResponse> {\n        const release = await this.mutex.acquire();\n        try {\n            return await this.wallet.sendTransaction(tx);\n        } finally {\n            release();\n        }\n    }\n\n    async computeCommitmentsForBlobs(blobs: Uint8Array[]): Promise<Uint8Array[]> {\n        return await this.kzg.computeCommitmentBatch(blobs);\n    }\n\n    async computeEthStorageHashesForBlobs(blobs: Uint8Array[]): Promise<string[]> {\n        const commitments = await this.computeCommitmentsForBlobs(blobs);\n        return convertToEthStorageHashes(commitments);\n    }\n\n    async getTransactionResult(hash: string): Promise<UploadResult> {\n        const txResponse = await this.provider.getTransaction(hash);\n        if (!txResponse) throw new Error(\"tx not found\");\n\n        const txReceipt = await txResponse.wait();\n        const txCost = calcTxCost(txReceipt);\n        return {\n            txCost,\n            success: txReceipt?.status === 1\n        };\n    }\n\n    async close(): Promise<void> {\n        await this.kzg.close();\n    }\n}\n","import { retry, stringToHex } from \"./util\";\nimport { Contract } from \"ethers\";\nimport { UploadDetails, ChunkCountResult, FileBatch, ChunkHashResult } from \"../param\";\n\nexport async function getUploadInfo(contract: Contract, hexName: string, retries: number): Promise<UploadDetails> {\n    const result = await retry(() => contract[\"getUploadInfo\"](hexName), retries);\n    return {\n        fileMode: Number(result[0]),\n        oldChunkCount: Number(result[1]),\n        cost: result[2] as bigint\n    };\n}\n\nexport async function getChunkCounts(contract: Contract, batch: string[], retries: number): Promise<ChunkCountResult[]> {\n    const names = batch.map(key => stringToHex(key));\n    const counts = await retry(() => contract[\"getChunkCountsBatch\"](names), retries);\n    const results: ChunkCountResult[] = [];\n    let index = 0;\n    for (const key of batch) {\n        results.push({ key, chunkCount: Number(counts[index++]) });\n    }\n    return results;\n}\n\nexport async function getChunkHashes(contract: Contract, batch: FileBatch[], retries: number): Promise<ChunkHashResult[]> {\n    const fileChunks = batch.map(file => [\n        stringToHex(file.name),\n        file.chunkIds\n    ]);\n\n    const hashes = await retry(() => contract[\"getChunkHashesBatch\"](fileChunks), retries);\n    const results: ChunkHashResult[] = [];\n    let index = 0;\n    for (const file of batch) {\n        for (let j = 0; j < file.chunkIds.length; j++) {\n            results.push(<ChunkHashResult>{ name: file.name, chunkId: file.chunkIds[j], hash: hashes[index++] });\n        }\n    }\n    return results;\n}\n","import { ethers } from \"ethers\";\nimport {\n    BlobUploader,\n    stringToHex,\n    getChainId,\n    encodeOpBlobs\n} from \"./utils\";\nimport {\n    SDKConfig,\n    DecodeType,\n    CostEstimate,\n    ETHSTORAGE_MAPPING,\n    BLOB_SIZE,\n    OP_BLOB_DATA_SIZE,\n    EthStorageAbi,\n    BLOB_COUNT_LIMIT,\n    DUMMY_VERSIONED_COMMITMENT_HASH\n} from \"./param\";\n\nexport class EthStorage {\n    private contractAddr!: string;\n\n    private ethStorageRpc?: string;\n    private wallet?: ethers.Wallet;\n    private blobUploader?: BlobUploader;\n\n    static async create(config: SDKConfig) {\n        const ethStorage = new EthStorage();\n        await ethStorage.init(config);\n        return ethStorage;\n    }\n\n    private async init(config: SDKConfig) {\n        const { rpc, privateKey, ethStorageRpc, address } = config;\n        if (address) {\n            this.contractAddr = address;\n        } else if (rpc) {\n            const chainId = await getChainId(rpc);\n            this.contractAddr = ETHSTORAGE_MAPPING[chainId];\n        }\n        if (!this.contractAddr) {\n            throw new Error(\"EthStorage: Network not supported yet.\");\n        }\n\n        this.ethStorageRpc = ethStorageRpc;\n\n        if (privateKey && rpc) {\n            const provider = new ethers.JsonRpcProvider(rpc);\n            this.wallet = new ethers.Wallet(privateKey, provider);\n            this.blobUploader = new BlobUploader(rpc, privateKey);\n        }\n    }\n\n    async estimateCost(key: string, data: Uint8Array): Promise<CostEstimate> {\n        this.checkData(data);\n        const hexKey = ethers.keccak256(stringToHex(key));\n        const contract = new ethers.Contract(this.contractAddr, EthStorageAbi, this._wallet);\n        const [storageCost, maxFeePerBlobGas, gasFeeData] = await Promise.all([\n            contract[\"upfrontPayment\"](),\n            this._blobUploader.getBlobGasPrice(),\n            this._blobUploader.getGasPrice(),\n        ]);\n\n        const gasLimit = await contract[\"putBlob\"].estimateGas(hexKey, 0, data.length, {\n            value: storageCost,\n            // Fixed dummy hashing to bypass the limitation that contracts need versioned hash when estimating gasLimit.\n            blobVersionedHashes: [DUMMY_VERSIONED_COMMITMENT_HASH]\n        });\n\n        // get cost\n        const totalGasCost = (gasFeeData.maxFeePerGas! + gasFeeData.maxPriorityFeePerGas!) * gasLimit;\n        const totalBlobGasCost = maxFeePerBlobGas * BigInt(BLOB_SIZE);\n        const gasCost = totalGasCost + totalBlobGasCost;\n        return {\n            storageCost,\n            gasCost\n        }\n    }\n\n    async write(key: string, data: Uint8Array): Promise<{ hash: string, success: boolean }> {\n        this.checkData(data);\n\n        const contract = new ethers.Contract(this.contractAddr, EthStorageAbi, this._wallet);\n        const hexKey = ethers.keccak256(stringToHex(key));\n        try {\n            const storageCost = await contract[\"upfrontPayment\"]();\n            const tx = await contract[\"putBlob\"].populateTransaction(hexKey, 0, data.length, {\n                value: storageCost,\n            });\n\n            const blobs = encodeOpBlobs(data);\n            const txRes = await this._blobUploader.sendTx(tx, blobs);\n            console.log(`EthStorage: Tx hash is ${txRes.hash}`);\n            const receipt = await txRes.wait();\n            return { hash: txRes.hash, success: receipt?.status === 1 };\n        } catch (e) {\n            console.error(`EthStorage: Write blob failed!`, (e as Error).message);\n        }\n        return { hash: '0x', success: false };\n    }\n\n    async read(\n        key: string,\n        decodeType = DecodeType.OptimismCompact,\n        address?: string\n    ): Promise<Uint8Array> {\n        if (!key) {\n            throw new Error(`EthStorage: Invalid key.`);\n        }\n        const fromAddress = this.wallet?.address || address;\n        if (!fromAddress) {\n            throw new Error(`EthStorage: Read operation requires an address when 'wallet' is not available.`);\n        }\n\n        const hexKey = ethers.keccak256(stringToHex(key));\n        const provider = new ethers.JsonRpcProvider(this._ethStorageRpc);\n        const contract = new ethers.Contract(this.contractAddr, EthStorageAbi, provider) as any;\n        const size = await contract.size(hexKey, {\n            from: fromAddress\n        });\n        if (size === 0n) {\n            throw new Error(`EthStorage: There is no data corresponding to key ${key} under wallet address ${fromAddress}.`);\n        }\n        const data = await contract.get(hexKey, decodeType, 0, size, {\n            from: fromAddress\n        });\n        return ethers.getBytes(data);\n    }\n\n    async writeBlobs(keys: string[], dataBlobs: Uint8Array[]): Promise<{ hash: string, success: boolean }> {\n        if (!keys || !dataBlobs) {\n            throw new Error(`EthStorage: Invalid parameter.`);\n        }\n        if (keys.length !== dataBlobs.length) {\n            throw new Error(`EthStorage: The number of keys and data does not match.`);\n        }\n        if (keys.length > BLOB_COUNT_LIMIT) {\n            throw new Error(`EthStorage: The count exceeds the maximum blob limit.`);\n        }\n\n        const blobLength = keys.length;\n        const blobArr = [];\n        const keyArr = [];\n        const idArr = [];\n        const lengthArr = [];\n        for (let i = 0; i < blobLength; i++) {\n            const data = dataBlobs[i];\n            this.checkData(data);\n            const blob = encodeOpBlobs(data);\n            blobArr.push(blob[0]);\n            keyArr.push(ethers.keccak256(stringToHex(keys[i])));\n            idArr.push(i);\n            lengthArr.push(data.length);\n        }\n\n        const contract = new ethers.Contract(this.contractAddr, EthStorageAbi, this._wallet);\n        try {\n            const storageCost = await contract[\"upfrontPayment\"]();\n            const tx = await contract[\"putBlobs\"].populateTransaction(keyArr, idArr, lengthArr, {\n                value: storageCost * BigInt(blobLength),\n            });\n\n            const txRes = await this._blobUploader.sendTx(tx, blobArr);\n            console.log(`EthStorage: Tx hash is ${txRes.hash}`);\n            const receipt = await txRes.wait();\n            return { hash: txRes.hash, success: receipt?.status === 1 };\n        } catch (e) {\n            console.error(`EthStorage: Put blobs failed!`, (e as Error).message);\n        }\n        return { hash: '0x', success: false };\n    }\n\n    async close(): Promise<void> {\n        if (this.blobUploader) {\n            await this.blobUploader.close();\n        }\n    }\n\n    // get\n    private get _wallet(): ethers.Wallet {\n        if (!this.wallet) {\n            throw new Error(\"EthStorage: Private key is required for this operation.\");\n        }\n        return this.wallet;\n    }\n\n    private get _blobUploader(): BlobUploader {\n        if (!this.blobUploader) {\n            throw new Error(\"EthStorage: _blobUploader is not initialized.\");\n        }\n        return this.blobUploader;\n    }\n\n    private get _ethStorageRpc(): string {\n        if (!this.ethStorageRpc) {\n            throw new Error(`EthStorage: Reading content requires providing 'ethStorageRpc'.`);\n        }\n        return this.ethStorageRpc;\n    }\n\n\n    private checkData(data: Uint8Array | null): void {\n        if (!data) {\n            throw new Error(`EthStorage: Invalid data.`);\n        }\n        if (data.length === 0 || data.length > OP_BLOB_DATA_SIZE) {\n            throw new Error(`EthStorage: the length of data(Uint8Array) should be > 0 && <= ${OP_BLOB_DATA_SIZE}.`);\n        }\n    }\n}\n","import pLimit from 'p-limit';\nimport { ethers } from \"ethers\";\nimport {\n    SDKConfig, EstimateGasRequest, UploadRequest, CostEstimate,\n    DownloadCallback, UploadType, ContentLike, FileBatch,\n    ChunkCountResult, ChunkHashResult, UploadDetails,\n    UploadCallback,\n    FlatDirectoryAbi, FlatDirectoryBytecode, ETHSTORAGE_MAPPING,\n    BLOB_SIZE, OP_BLOB_DATA_SIZE,\n    MAX_BLOB_COUNT, MAX_RETRIES, MAX_CHUNKS,\n    FLAT_DIRECTORY_CONTRACT_VERSION_1_0_0,\n    FLAT_DIRECTORY_CONTRACT_VERSION_1_1_0,\n    DUMMY_VERSIONED_COMMITMENT_HASH\n} from './param';\nimport {\n    BlobUploader,\n    encodeOpBlobs,\n    getChainId,\n    isBuffer, isFile,\n    stringToHex,\n    retry, getContentChunk,\n    getUploadInfo, getChunkCounts,\n    getChunkHashes, convertToEthStorageHashes,\n} from \"./utils\";\n\nconst defaultCallback: DownloadCallback = {\n    onProgress: () => { },\n    onFail: () => { },\n    onFinish: () => { }\n};\n\nexport class FlatDirectory {\n    private rpc?: string;\n    private ethStorageRpc?: string;\n    private contractAddr?: string;\n\n    private wallet?: ethers.Wallet;\n    private blobUploader?: BlobUploader;\n\n    private retries: number = MAX_RETRIES;\n    public isSupportBlob: boolean = false;\n\n    private logEnabled: boolean = true;\n\n    static async create(config: SDKConfig) {\n        const flatDirectory = new FlatDirectory();\n        await flatDirectory.init(config);\n        return flatDirectory;\n    }\n\n    setLogEnabled(value: boolean) {\n        this.logEnabled = value;\n    }\n\n    async init(config: SDKConfig) {\n        const { privateKey, rpc, address, ethStorageRpc } = config;\n        this.rpc = rpc;\n        this.contractAddr = address;\n        this.ethStorageRpc = ethStorageRpc;\n\n        if (privateKey && rpc) {\n            // normal\n            const provider = new ethers.JsonRpcProvider(rpc);\n            this.wallet = new ethers.Wallet(privateKey, provider);\n            this.blobUploader = new BlobUploader(rpc, privateKey);\n            if (!address) return;\n        } else if (!ethStorageRpc || !address) {\n            // check is read-only mode?\n            throw new Error(\"FlatDirectory: Read-only mode requires both 'ethStorageRpc' and 'address'\");\n        }\n\n        // check solidity version\n        const localRpc = rpc || ethStorageRpc;\n        const provider = new ethers.JsonRpcProvider(localRpc!);\n        const fileContract = new ethers.Contract(address, FlatDirectoryAbi, provider);\n        const [supportBlob, contractVersion] = await Promise.all([\n            retry(() => fileContract[\"isSupportBlob\"](), this.retries).catch((e) => {\n                if (e?.code === 'BAD_DATA') return false;\n                throw e;\n            }),\n            retry(() => fileContract[\"version\"](), this.retries).catch((e) => {\n                if (e?.code === 'BAD_DATA') return \"0\";\n                throw e;\n            })\n        ]);\n        if (contractVersion !== FLAT_DIRECTORY_CONTRACT_VERSION_1_1_0) {\n            // Release the worker, otherwise the SDK creation fails, but the worker still exists.\n            await this.close();\n\n            let sdkSuggestion: string;\n            if (contractVersion === FLAT_DIRECTORY_CONTRACT_VERSION_1_0_0) {\n                sdkSuggestion = \"SDK v3.x\";\n            } else {\n                sdkSuggestion = \"SDK v2.x or below\";\n            }\n            throw new Error(\n                `FlatDirectory: The current SDK no longer supports this contract version (${contractVersion}).\\n` +\n                `Please either:\\n` +\n                `  1) Deploy a new compatible contract, or\\n` +\n                `  2) Use ${sdkSuggestion} to interact with this contract.`\n            );\n        }\n        this.isSupportBlob = supportBlob as boolean;\n    }\n\n    async deploy(): Promise<string | null> {\n        const chainId = await getChainId(this._rpc);\n        this.isSupportBlob = ETHSTORAGE_MAPPING[chainId] != null;\n\n        const ethStorage = ETHSTORAGE_MAPPING[chainId] || '0x0000000000000000000000000000000000000000';\n        const factory = new ethers.ContractFactory(FlatDirectoryAbi, FlatDirectoryBytecode, this._wallet);\n        try {\n            // @ts-ignore\n            const contract = await factory.deploy(0, OP_BLOB_DATA_SIZE, ethStorage, {gasLimit: 3800000});\n            await contract.waitForDeployment();\n\n            this.contractAddr = await contract.getAddress();\n            this.#log(`Contract deployed successfully. Address is ${this.contractAddr}`);\n            return this.contractAddr;\n        } catch (e) {\n            this.#log(`Deployment failed! ${(e as any).message || e}`, true);\n            return null;\n        }\n    }\n\n    async setDefault(filename: string): Promise<boolean> {\n        const hexName = filename ? stringToHex(filename) : \"0x\";\n        const fileContract = new ethers.Contract(this._contractAddr, FlatDirectoryAbi, this._wallet) as any;\n        try {\n            const tx = await fileContract.setDefault(hexName);\n            this.#log(`Setting default file (Key: ${filename}). Transaction sent (Hash: ${tx.hash})`);\n            const txReceipt = await tx.wait();\n            return txReceipt.status === 1;\n        } catch (e) {\n            this.#log(`Failed to set default file (Key: ${filename}). ${(e as any).message || e}`, true);\n        }\n        return false;\n    }\n\n    async remove(key: string): Promise<boolean> {\n        const fileContract = new ethers.Contract(this._contractAddr, FlatDirectoryAbi, this._wallet) as any;\n        try {\n            const tx = await fileContract.remove(stringToHex(key));\n            this.#log(`File removal initiated (Key: ${key}). Hash: ${tx.hash}`);\n            const receipt = await tx.wait();\n            return receipt.status === 1;\n        } catch (e) {\n            this.#log(`Failed to remove file (Key: ${key}). ${(e as any).message || e}`, true);\n        }\n        return false;\n    }\n\n    async download(key: string, cb: DownloadCallback = defaultCallback) {\n        const hexName = stringToHex(key);\n        const provider = new ethers.JsonRpcProvider(this._ethStorageRpc);\n        const contract = new ethers.Contract(this._contractAddr, FlatDirectoryAbi, provider);\n        try {\n            const result = await getChunkCounts(contract, [key], this.retries);\n            const totalChunks = result[0].chunkCount;\n            if (totalChunks === 0) {\n                cb.onFinish();\n                return;\n            }\n\n            await this.#download(contract, hexName, totalChunks, cb);\n            cb.onFinish();\n        } catch (err) {\n            cb.onFail(err as Error);\n        }\n    }\n\n    async fetchHashes(keys: string[]): Promise<Record<string, string[]>> {\n        if (!keys || !Array.isArray(keys)) {\n            throw new Error('Invalid keys.');\n        }\n\n        // get file chunks\n        const contract = new ethers.Contract(this._contractAddr, FlatDirectoryAbi, this._wallet);\n        const fileInfos = await getChunkCounts(contract, keys, this.retries);\n        return this.#fetchHashes(fileInfos);\n    }\n\n    async estimateCost(request: EstimateGasRequest): Promise<CostEstimate> {\n        const { key, type } = request;\n        if (!key) {\n            throw new Error(`FlatDirectory: Invalid key!`);\n        }\n\n        if (type === UploadType.Blob) {\n            return await this.#estimateCostByBlob(request);\n        } else {\n            return await this.#estimateCostByCallData(request);\n        }\n    }\n\n    async upload(request: UploadRequest): Promise<void> {\n        const { key, callback, type } = request;\n        if (!callback) {\n            throw new Error(`FlatDirectory: Invalid callback object!`);\n        }\n        if (!key) {\n            callback.onFail!(new Error(`FlatDirectory: Invalid key!`));\n            callback.onFinish!(0, 0, 0n);\n            return;\n        }\n        if (!this.contractAddr) {\n            callback.onFail!(new Error(`FlatDirectory: FlatDirectory not deployed!`));\n            callback.onFinish!(0, 0, 0n);\n            return;\n        }\n        if (!this.wallet) {\n            callback.onFail!(new Error(`FlatDirectory: Private key is required for this operation.`));\n            callback.onFinish!(0, 0, 0n);\n            return;\n        }\n\n        if (type === UploadType.Blob) {\n            await this.#uploadByBlob(request);\n        } else {\n            await this.#uploadByCallData(request);\n        }\n    }\n\n    async close(): Promise<void> {\n        if (this.blobUploader) {\n            await this.blobUploader.close();\n        }\n    }\n\n\n    // private method\n    async #download(\n        contract: ethers.Contract,\n        hexName: string,\n        totalChunks: number,\n        cb: DownloadCallback\n    ) {\n        // Ordered cache + sequential callback\n        const downloadedResults = new Map<number, Uint8Array>();\n        let nextCallbackStart = 0;\n        const flushReadyChunks = () => {\n            while (downloadedResults.has(nextCallbackStart)) {\n                const data = downloadedResults.get(nextCallbackStart)!;\n                cb.onProgress(nextCallbackStart, totalChunks, data);\n                downloadedResults.delete(nextCallbackStart);\n                nextCallbackStart++;\n            }\n        };\n\n        const fetchSingle = async (i: number) => {\n            const [data] = await contract['readChunk'](hexName, i);\n            downloadedResults.set(i, ethers.getBytes(data));\n            flushReadyChunks();\n        };\n\n        // download task\n        let DEFAULT_MAX_CONCURRENCY: number;\n        if (typeof window !== 'undefined' && typeof navigator !== 'undefined') {\n            DEFAULT_MAX_CONCURRENCY = 6;\n        } else if (typeof process !== 'undefined' && process.versions?.node) {\n            try {\n                const os = await import('os');\n                const cores = os.cpus().length;\n                DEFAULT_MAX_CONCURRENCY = Math.max(2, Math.min(20, cores * 2));\n            } catch (err) {\n                DEFAULT_MAX_CONCURRENCY = 10;\n            }\n        } else {\n            DEFAULT_MAX_CONCURRENCY = 6;\n        }\n        const limit = pLimit(DEFAULT_MAX_CONCURRENCY);\n        const quests = Array.from({ length: totalChunks }, (_, i) =>\n                limit(() => retry(() => fetchSingle(i), this.retries))\n            );\n\n        await Promise.all(quests);\n        await new Promise(r => setTimeout(r, 0));\n        flushReadyChunks(); // flush any remaining pages\n    }\n\n    async #fetchHashes(fileInfos: ChunkCountResult[]): Promise<Record<string, string[]>> {\n        const allHashes: Record<string, string[]> = {};\n\n        const batchArray: Record<string, number[]>[] = [];\n        let currentBatch: Record<string, number[]> = {};\n        let currentChunkCount = 0;\n        for (const { key, chunkCount } of fileInfos) {\n            allHashes[key] = chunkCount === 0 ? [] : new Array(chunkCount);\n\n            for (let i = 0; i < chunkCount; i++) {\n                if (!currentBatch[key]) {\n                    currentBatch[key] = [];\n                }\n                currentBatch[key].push(i);\n                currentChunkCount++;\n                // If the batch reaches the chunk limit, create a task\n                if (currentChunkCount === MAX_CHUNKS) {\n                    batchArray.push(currentBatch);\n                    currentBatch = {};\n                    currentChunkCount = 0;\n                }\n            }\n        }\n        if (Object.keys(currentBatch).length > 0) {\n            batchArray.push(currentBatch);\n        }\n\n        // request\n        if (batchArray.length > 0) {\n            const contract = new ethers.Contract(this.contractAddr!, FlatDirectoryAbi, this.wallet!);\n            const hashResults = await Promise.all(batchArray.map(batch => {\n                const fileChunksArray: FileBatch[] = Object.keys(batch).map(name => ({\n                    name,\n                    chunkIds: batch[name]\n                }));\n                return getChunkHashes(contract, fileChunksArray, this.retries);\n            }));\n            // Combine results\n            hashResults.flat().forEach(({ name, chunkId, hash }: ChunkHashResult) => {\n                allHashes[name][chunkId] = hash;\n            });\n        }\n        return allHashes;\n    }\n\n    async #estimateCostByBlob(request: EstimateGasRequest): Promise<CostEstimate> {\n        let { key, content, chunkHashes, gasIncPct = 0 } = request;\n\n        if (!this.isSupportBlob) {\n            throw new Error(`FlatDirectory: The contract does not support blob upload!`);\n        }\n\n        // check data\n        const blobLength = this.#getBlobLength(content);\n        if (blobLength === -1) {\n            throw new Error(`FlatDirectory: Invalid upload content!`);\n        }\n\n        // get file info\n        const hexName = stringToHex(key);\n        const fileContract = new ethers.Contract(this._contractAddr, FlatDirectoryAbi, this._wallet);\n        const { cost, oldChunkCount, fileMode, maxFeePerBlobGas, gasFeeData } = await this.#getEstimateBlobInfo(fileContract, hexName);\n        if (fileMode !== UploadType.Blob && fileMode !== UploadType.Undefined) {\n            throw new Error(\"FlatDirectory: This file does not support blob upload!\");\n        }\n\n        // Get old chunk hashes, If the chunk hashes is not passed, it is obtained here\n        if (!chunkHashes) {\n            const hashes = await this.#fetchHashes([{ key, chunkCount: oldChunkCount }]);\n            chunkHashes = hashes[key];\n        }\n\n        let totalGasCost = 0n;\n        let totalStorageCost = 0n;\n        let gasLimit = 0n;\n        // send\n        for (let i = 0; i < blobLength; i += MAX_BLOB_COUNT) {\n            const { blobArr, chunkIdArr, chunkSizeArr } = await this.#getBlobInfo(content, i);\n\n            let blobHashArr: string[] | null = null;\n            // not change\n            if (i + blobArr.length <= chunkHashes.length) {\n                blobHashArr = await this._blobUploader.computeEthStorageHashesForBlobs(blobArr);\n                const cloudHashArr = chunkHashes.slice(i, i + blobHashArr.length);\n                if (JSON.stringify(blobHashArr) === JSON.stringify(cloudHashArr)) {\n                    continue;\n                }\n            }\n\n            // upload\n            // storage cost\n            const value = cost * BigInt(blobArr.length);\n            totalStorageCost += value;\n            // gas cost\n            if (gasLimit === 0n) {\n                // Use a fixed dummy versioned hash only if blobHashArr is not provided (for gas estimation compatibility).\n                gasLimit = await retry(() => fileContract[\"writeChunksByBlobs\"].estimateGas(hexName, chunkIdArr, chunkSizeArr, {\n                    value: value,\n                    blobVersionedHashes: new Array(blobArr.length).fill(DUMMY_VERSIONED_COMMITMENT_HASH)\n                }), this.retries);\n            }\n            const gasCost = (gasFeeData!.maxFeePerGas! + gasFeeData!.maxPriorityFeePerGas!) * BigInt(gasLimit)\n                + maxFeePerBlobGas! * BigInt(BLOB_SIZE);\n            totalGasCost += gasCost;\n        }\n\n        totalGasCost += (totalGasCost * BigInt(gasIncPct)) / 100n;\n        return {\n            storageCost: totalStorageCost,\n            gasCost: totalGasCost\n        }\n    }\n\n    async #estimateCostByCallData(request: EstimateGasRequest): Promise<CostEstimate> {\n        let { key, content, chunkHashes, gasIncPct = 0 } = request;\n\n        const { chunkDataSize, chunkLength } = this.#getChunkLength(content);\n        if (chunkDataSize === -1) {\n            throw new Error(`FlatDirectory: Invalid upload content!`);\n        }\n\n        const hexName = stringToHex(key);\n        const fileContract = new ethers.Contract(this._contractAddr, FlatDirectoryAbi, this._wallet) as any;\n        const { oldChunkCount, fileMode, gasFeeData } = await this.#getEstimateCallDataInfo(fileContract, hexName);\n        if (fileMode !== UploadType.Calldata && fileMode !== UploadType.Undefined) {\n            throw new Error(`FlatDirectory: This file does not support calldata upload!`);\n        }\n\n        // Get old chunk hashes, If the chunk hashes is not passed, it is obtained here\n        if (!chunkHashes) {\n            const hashes = await this.#fetchHashes([{ key, chunkCount: oldChunkCount }]);\n            chunkHashes = hashes[key];\n        }\n\n        let totalGasCost = 0n;\n        let gasLimit = 0n;\n        for (let i = 0; i < chunkLength; i++) {\n            const chunk = await getContentChunk(content, i * chunkDataSize, (i + 1) * chunkDataSize);\n\n            // not change\n            if (i < chunkHashes.length && ethers.keccak256(chunk) === chunkHashes[i]) {\n                continue;\n            }\n\n            // get gas cost\n            if (i === chunkLength - 1 || gasLimit === 0n) {\n                const hexData = ethers.hexlify(chunk);\n                gasLimit = await retry(() => fileContract[\"writeChunkByCalldata\"].estimateGas(hexName, 0, hexData), this.retries);\n            }\n            totalGasCost += (gasFeeData!.maxFeePerGas! + gasFeeData!.maxPriorityFeePerGas!) * gasLimit;\n        }\n        totalGasCost += (totalGasCost * BigInt(gasIncPct)) / 100n;\n\n        return {\n            storageCost: 0n,\n            gasCost: totalGasCost\n        }\n    }\n\n    async #uploadByBlob(request: UploadRequest): Promise<void> {\n        let totalUploadChunks = 0, totalUploadSize = 0;\n        let totalCost = 0n;\n\n        let { key, content, callback, chunkHashes, gasIncPct = 0, isConfirmedNonce = false } = request;\n        if (!this.isSupportBlob) {\n            callback.onFail?.(new Error(`FlatDirectory: The contract does not support blob upload!`));\n            callback.onFinish?.(totalUploadChunks, totalUploadSize, totalCost);\n            return;\n        }\n\n        const blobLength = this.#getBlobLength(content);\n        if (blobLength === -1) {\n            callback.onFail?.(new Error(`FlatDirectory: Invalid upload content!`));\n            callback.onFinish?.(totalUploadChunks, totalUploadSize, totalCost);\n            return;\n        }\n\n        const hexName = stringToHex(key);\n        const fileContract = new ethers.Contract(this.contractAddr!, FlatDirectoryAbi, this.wallet!);\n        const { cost, oldChunkCount, fileMode } = await this.#getUploadInfo(fileContract, hexName);\n        if (fileMode !== UploadType.Blob && fileMode !== UploadType.Undefined) {\n            callback.onFail!(new Error(`FlatDirectory: This file does not support blob upload!`));\n            callback.onFinish!(totalUploadChunks, totalUploadSize, totalCost);\n            return;\n        }\n\n        const clearState = await retry(() => this.#clearOldFile(fileContract, hexName, blobLength, oldChunkCount), this.retries);\n        if (!clearState) {\n            callback.onFail!(new Error(`FlatDirectory: Failed to truncate old data!`));\n            callback.onFinish!(totalUploadChunks, totalUploadSize, totalCost);\n            return;\n        }\n\n        // Get old chunk hashes, If the chunk hashes is not passed, it is obtained here\n        if (!chunkHashes) {\n            const hashes = await this.#fetchHashes([{ key, chunkCount: oldChunkCount }]);\n            chunkHashes = hashes[key];\n        }\n\n        // send\n        for (let i = 0; i < blobLength; i += MAX_BLOB_COUNT) {\n            const {\n                blobArr, chunkIdArr, chunkSizeArr\n            } = await this.#getBlobInfo(content, i);\n            const blobCommitmentArr = await this._blobUploader.computeCommitmentsForBlobs(blobArr);\n\n            // not change\n            if (i + blobArr.length <= chunkHashes.length) {\n                const localHashArr = convertToEthStorageHashes(blobCommitmentArr);\n                const cloudHashArr = chunkHashes.slice(i, i + localHashArr.length);\n                if (JSON.stringify(localHashArr) === JSON.stringify(cloudHashArr)) {\n                    callback.onProgress!(chunkIdArr[chunkIdArr.length - 1], blobLength, false);\n                    continue;\n                }\n            }\n\n            // upload\n            const txResponse = await retry(() => this.#uploadBlob(fileContract, key, hexName, blobArr,\n                blobCommitmentArr, chunkIdArr, chunkSizeArr, cost, gasIncPct, isConfirmedNonce, callback as UploadCallback), this.retries);\n            const uploadResult = await retry(() => this._blobUploader.getTransactionResult(txResponse.hash), this.retries);\n\n            // Count tx costs, regardless of success or failure.\n            totalCost += cost * BigInt(blobArr.length); // storage cost\n            totalCost += uploadResult.txCost.normalGasCost + uploadResult.txCost.blobGasCost;\n\n            // fail\n            if (!uploadResult.success) {\n                callback.onFail!(new Error(\"FlatDirectory: Sending transaction failed.\"));\n                break;\n            }\n            // success\n            callback.onProgress!(chunkIdArr[chunkIdArr.length - 1], blobLength, true);\n            totalUploadChunks += blobArr.length;\n            totalUploadSize += chunkSizeArr.reduce((acc: number, size: number) => acc + size, 0);\n        }\n\n        callback.onFinish!(totalUploadChunks, totalUploadSize, totalCost);\n    }\n\n    async #uploadByCallData(request: UploadRequest): Promise<void> {\n        let totalUploadChunks = 0, totalUploadSize = 0;\n        let totalCost = 0n;\n\n        let { key, content, callback, chunkHashes, gasIncPct = 0, isConfirmedNonce = false } = request;\n\n        const { chunkDataSize, chunkLength } = this.#getChunkLength(content);\n        if (chunkDataSize === -1) {\n            callback.onFail!(new Error(`FlatDirectory: Invalid upload content!`));\n            callback.onFinish!(totalUploadChunks, totalUploadSize, totalCost);\n            return;\n        }\n\n        const hexName = stringToHex(key);\n        const fileContract = new ethers.Contract(this.contractAddr!, FlatDirectoryAbi, this.wallet!);\n        const { oldChunkCount, fileMode } = await this.#getUploadInfo(fileContract, hexName);\n        if (fileMode !== UploadType.Calldata && fileMode !== UploadType.Undefined) {\n            callback.onFail!(new Error(`FlatDirectory: This file does not support calldata upload!`));\n            callback.onFinish!(totalUploadChunks, totalUploadSize, totalCost);\n            return;\n        }\n\n        // check old data\n        const clearState = await retry(() => this.#clearOldFile(fileContract, hexName, chunkLength, oldChunkCount), this.retries);\n        if (!clearState) {\n            callback.onFail!(new Error(`FlatDirectory: Failed to truncate old data!`));\n            callback.onFinish!(totalUploadChunks, totalUploadSize, totalCost);\n            return;\n        }\n\n        // Get old chunk hashes, If the chunk hashes is not passed, it is obtained here\n        if (!chunkHashes) {\n            const hashes = await this.#fetchHashes([{ key, chunkCount: oldChunkCount }]);\n            chunkHashes = hashes[key];\n        }\n\n        for (let i = 0; i < chunkLength; i++) {\n            const chunk = await getContentChunk(content, i * chunkDataSize, (i + 1) * chunkDataSize);\n\n            // not change\n            if (i < chunkHashes.length && ethers.keccak256(chunk) === chunkHashes[i]) {\n                callback.onProgress!(i, chunkLength, false);\n                continue;\n            }\n\n            // upload\n            const txResponse = await retry(() => this.#uploadCallData(fileContract, key, hexName, i,\n                chunk, gasIncPct, isConfirmedNonce, callback as UploadCallback), this.retries);\n            const uploadResult = await retry(() => this._blobUploader.getTransactionResult(txResponse.hash), this.retries);\n\n            // count tx costs, regardless of success or failure.\n            totalCost += uploadResult.txCost.normalGasCost; // no blob/storage\n\n            // fail\n            if (!uploadResult.success) {\n                callback.onFail!(new Error(\"FlatDirectory: Sending transaction failed.\"));\n                break;\n            }\n            // success\n            callback.onProgress!(i, chunkLength, true);\n            totalUploadChunks++;\n            totalUploadSize += chunk.length;\n        }\n\n        callback.onFinish!(totalUploadChunks, totalUploadSize, totalCost);\n    }\n\n    async #getEstimateBlobInfo(contract: any, hexName: string): Promise<UploadDetails> {\n        const [result, maxFeePerBlobGas, gasFeeData]: [UploadDetails, bigint, ethers.FeeData] = await Promise.all([\n            getUploadInfo(contract, hexName, this.retries),\n            retry(() => this._blobUploader.getBlobGasPrice(), this.retries),\n            retry(() => this._blobUploader.getGasPrice(), this.retries),\n        ]);\n        return {\n            ...result,\n            maxFeePerBlobGas,\n            gasFeeData\n        }\n    }\n\n    async #getEstimateCallDataInfo(contract: any, hexName: string): Promise<UploadDetails> {\n        const [result, gasFeeData]: [UploadDetails, ethers.FeeData] = await Promise.all([\n            getUploadInfo(contract, hexName, this.retries),\n            retry(() => this._blobUploader.getGasPrice(), this.retries),\n        ]);\n        return {\n            ...result,\n            gasFeeData\n        }\n    }\n\n    async #getUploadInfo(contract: any, hexName: string): Promise<UploadDetails> {\n        return await getUploadInfo(contract, hexName, this.retries);\n    }\n\n    async #clearOldFile(contract: any, key: string, chunkLength: number, oldChunkLength: number): Promise<boolean> {\n        if (oldChunkLength > chunkLength) {\n            // truncate\n            try {\n                const tx = await contract.truncate(stringToHex(key), chunkLength);\n                this.#log(`Truncate transaction sent (Key: ${key}, New length: ${chunkLength}). Hash: ${tx.hash}`);\n                const receipt = await tx.wait();\n                return receipt?.status === 1;\n            } catch (e) {\n                this.#log(`Failed to truncate old data for file (Key: ${key}). ${(e as any).message || e}`, true);\n                return false;\n            }\n        }\n        return true;\n    }\n\n    async #uploadBlob(\n        fileContract: ethers.Contract,\n        key: string,\n        hexName: string,\n        blobArr: Uint8Array[],\n        blobCommitmentArr: Uint8Array[],\n        chunkIdArr: number[],\n        chunkSizeArr: number[],\n        cost: bigint,\n        gasIncPct: number,\n        isConfirmedNonce: boolean,\n        callback: UploadCallback\n    ): Promise<ethers.TransactionResponse> {\n        // create tx\n        const value = cost * BigInt(blobArr.length);\n        const tx: ethers.TransactionRequest = await fileContract[\"writeChunksByBlobs\"].populateTransaction(hexName, chunkIdArr, chunkSizeArr, {\n            value: value,\n        });\n        // Increase % if user requests it\n        if (gasIncPct > 0) {\n            // Fetch the current gas price and increase it\n            const feeData = await this._blobUploader.getGasPrice();\n            tx.maxFeePerGas = feeData.maxFeePerGas! * BigInt(100 + gasIncPct) / BigInt(100);\n            tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas! * BigInt(100 + gasIncPct) / BigInt(100);\n            // blob gas\n            const blobGas = await this._blobUploader.getBlobGasPrice();\n            tx.maxFeePerBlobGas = blobGas * BigInt(100 + gasIncPct) / BigInt(100);\n        }\n\n        // send\n        const txResponse = await this._blobUploader.sendTxLock(tx, isConfirmedNonce, blobArr, blobCommitmentArr);\n        this.#printHashLog(key, chunkIdArr, txResponse.hash, callback);\n        return txResponse;\n    }\n\n    async #uploadCallData(\n        fileContract: any,\n        key: string,\n        hexName: string,\n        chunkId: number,\n        chunk: Uint8Array,\n        gasIncPct: number,\n        isConfirmedNonce: boolean,\n        callback: UploadCallback\n    ): Promise<ethers.TransactionResponse> {\n        const hexData = ethers.hexlify(chunk);\n        const cost = chunk.length > 24 * 1024 - 326 ? BigInt(Math.floor((chunk.length + 326) / 1024 / 24)) : 0n;\n        const tx = await fileContract[\"writeChunkByCalldata\"].populateTransaction(hexName, chunkId, hexData, {\n            value: ethers.parseEther(cost.toString())\n        });\n        // Increase % if user requests it\n        if (gasIncPct > 0) {\n            // Fetch the current gas price and increase it\n            const feeData = await this._blobUploader.getGasPrice();\n            tx.maxFeePerGas = feeData.maxFeePerGas! * BigInt(100 + gasIncPct) / BigInt(100);\n            tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas! * BigInt(100 + gasIncPct) / BigInt(100);\n        }\n\n        // send\n        const txResponse = await this._blobUploader.sendTxLock(tx, isConfirmedNonce);\n        this.#printHashLog(key, chunkId, txResponse.hash, callback);\n        return txResponse;\n    }\n\n    #getBlobLength(content: ContentLike): number {\n        let blobLength = -1;\n        if (isFile(content)) {\n            blobLength = Math.ceil(content.size / OP_BLOB_DATA_SIZE);\n        } else if (isBuffer(content)) {\n            blobLength = Math.ceil(content.length / OP_BLOB_DATA_SIZE);\n        }\n        return blobLength;\n    }\n\n    async #getBlobInfo(content: ContentLike, index: number): Promise<{ blobArr: Uint8Array[]; chunkIdArr: number[]; chunkSizeArr: number[] }> {\n        const data = await getContentChunk(content, index * OP_BLOB_DATA_SIZE, (index + MAX_BLOB_COUNT) * OP_BLOB_DATA_SIZE);\n        const blobArr = encodeOpBlobs(data);\n\n        const chunkIdArr: number[] = [];\n        const chunkSizeArr: number[] = [];\n        for (let j = 0; j < blobArr.length; j++) {\n            chunkIdArr.push(index + j);\n            if (j === blobArr.length - 1) {\n                chunkSizeArr.push(data.length - OP_BLOB_DATA_SIZE * j);\n            } else {\n                chunkSizeArr.push(OP_BLOB_DATA_SIZE);\n            }\n        }\n        return { blobArr, chunkIdArr, chunkSizeArr }\n    }\n\n    #getChunkLength(content: ContentLike): { chunkDataSize: number; chunkLength: number } {\n        const maxChunkSize = 24 * 1024 - 326;\n        const getChunkInfo = (size: number) => ({\n            chunkDataSize: size > maxChunkSize ? maxChunkSize : size,\n            chunkLength: size > maxChunkSize ? Math.ceil(size / maxChunkSize) : 1\n        });\n\n        if (isFile(content)) {\n            return getChunkInfo(content.size);\n        } else if (isBuffer(content)) {\n            return getChunkInfo(content.length);\n        }\n        return { chunkDataSize: -1, chunkLength: 1 };\n    }\n\n    #printHashLog(key: string, chunkIds: number[] | number, hash: string, callback: UploadCallback) {\n        const ids = Array.isArray(chunkIds) ? chunkIds.join(\",\") : chunkIds;\n        const primaryMessage = `Transaction hash: ${hash} for chunk(s) ${ids}.`;\n        const fullMessage = `${primaryMessage} (Key: ${key})`;\n        this.#log(fullMessage);\n\n        if (callback?.onTransactionSent) {\n            callback.onTransactionSent(hash, chunkIds);\n        }\n    }\n\n    #log(message: string, isError: boolean = false) {\n        if (!this.logEnabled) return;\n        const prefix = \"FlatDirectory: \";\n        if (isError) {\n            console.error(`${prefix}${message}`);\n        } else {\n            console.log(`${prefix}${message}`);\n        }\n    }\n\n    // -------------------- getter --------------------\n    private get _contractAddr(): string {\n        if (!this.contractAddr) throw new Error(\"FlatDirectory: Not deployed!\");\n        return this.contractAddr;\n    }\n\n    private get _ethStorageRpc(): string {\n        if (!this.ethStorageRpc) throw new Error(\"FlatDirectory: 'ethStorageRpc' required.\");\n        return this.ethStorageRpc;\n    }\n\n    private get _rpc(): string {\n        if (!this.rpc) throw new Error(\"FlatDirectory: 'rpc' required.\");\n        return this.rpc;\n    }\n\n    private get _wallet(): ethers.Wallet {\n        if (!this.wallet) throw new Error(\"FlatDirectory: Private key required.\");\n        return this.wallet;\n    }\n\n    private get _blobUploader(): BlobUploader {\n        if (!this.blobUploader) throw new Error(\"FlatDirectory: _blobUploader not initialized.\");\n        return this.blobUploader;\n    }\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,cAAc;AAGhB,IAAM,cAAc,CAAC,MAAsB,OAAO,QAAQ,OAAO,YAAY,CAAC,CAAC;AAEtF,eAAsB,WAAW,KAA8B;AAC3D,QAAM,WAAW,IAAI,OAAO,gBAAgB,GAAG;AAC/C,QAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,SAAO,OAAO,QAAQ,OAAO;AACjC;AAEA,eAAsB,gBAAgB,SAAsB,OAAe,KAAa;AACpF,MAAI,SAAS,OAAO,GAAG;AACnB,WAAO,QAAQ,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,MAAM,CAAC;AAAA,EAC7D,OAAO;AACH,UAAM,QAAQ,QAAQ,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,IAAI,CAAC;AAC9D,UAAM,OAAO,MAAM,MAAM,YAAY;AACrC,WAAO,IAAI,WAAW,IAAI;AAAA,EAC9B;AACJ;AAEO,SAAS,SAAS,SAA6C;AAClE,SAAO,mBAAmB;AAC9B;AAEO,SAAS,OAAO,SAA2C;AAC9D,MAAI,SAAS,GAAG;AACZ,WAAO,WAAW,OAAO,YAAY,YACjC,OAAQ,QAAgB,aAAa,aACpC,QAAgB;AAAA,EACzB,OAAO;AACH,WAAO,mBAAmB;AAAA,EAC9B;AACJ;AAEO,SAAS,WAAoB;AAChC,SAAO,OAAO,YAAY,eAAe,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,QAAQ,SAAS;AACtF;AAEO,SAAS,+BAA+B,YAAoC;AAC/E,QAAM,wBAAwB,IAAI,WAAW,EAAE;AAC/C,wBAAsB,IAAI,CAAC,CAAI,GAAG,CAAC;AACnC,QAAM,OAAO,OAAO,SAAS,OAAO,OAAO,UAAU,CAAC;AACtD,wBAAsB,IAAI,KAAK,SAAS,CAAC,GAAG,CAAC;AAC7C,SAAO;AACX;AAEO,SAAS,wBAAwB,YAAgC;AACpE,QAAM,YAAY,+BAA+B,UAAU;AAC3D,QAAM,OAAO,IAAI,WAAW,EAAE;AAC9B,OAAK,IAAI,UAAU,SAAS,GAAG,KAAK,CAAC,CAAC;AACtC,SAAO,OAAO,QAAQ,IAAI;AAC9B;AAEO,SAAS,0BAA0B,aAAqC;AAC3E,SAAO,YAAY,IAAI,gBAAc,wBAAwB,UAAU,CAAC;AAC5E;AAEA,eAAsB,MAAS,IAAoC,YAAoB,MAAyB;AAC5G,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAC9B,QAAI;AACA,aAAO,MAAM,GAAG,GAAG,IAAI;AAAA,IAC3B,SAAS,OAAO;AACZ,UAAI,MAAM,UAAU,GAAG;AACnB,cAAM;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AACA,QAAM,IAAI,MAAM,uCAAuC;AAC3D;AAEO,SAAS,KAAK,KAAiB,QAAgB,KAAiB,QAAwB;AAC3F,QAAM,YAAY,IAAI,SAAS;AAC/B,QAAM,YAAY,IAAI,SAAS;AAC/B,QAAM,SAAS,KAAK,IAAI,WAAW,SAAS;AAC5C,MAAI,IAAI,IAAI,SAAS,QAAQ,SAAS,MAAM,GAAG,MAAM;AACrD,SAAO;AACX;AAEO,SAAS,WAAW,SAAmD;AAC1E,MAAI,CAAC,SAAS;AACV,WAAO,EAAE,eAAe,IAAI,aAAa,GAAG;AAAA,EAChD;AAGA,QAAM,gBAAwB,QAAQ,UAAU,QAAQ;AAExD,QAAM,cAAsB,QAAQ,eAAe,QAAQ,eACrD,OAAO,QAAQ,WAAW,IAAI,OAAO,QAAQ,YAAY,IACzD;AACN,SAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;;;AC7FO,IAAM,gBAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,mBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACzBA,IAAM,mBAA2B;AACjC,IAAM,mBAA2B;AACjC,IAAM,iCAAyC;AAExC,IAAM,qBAA6C;AAAA,EACtD,CAAC,gBAAgB,GAAG;AAAA,EACpB,CAAC,gBAAgB,GAAG;AAAA,EACpB,CAAC,8BAA8B,GAAG;AACtC;AAIA,IAAM,6BAAqC;AAC3C,IAAM,6BAAqC;AACpC,IAAM,YAAoB,6BAA6B;AAEvD,IAAM,qBAA6B,IAAI,KAAK,KAAK,OAAO;AAIxD,IAAK,aAAL,kBAAKA,gBAAL;AACH,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AAHQ,SAAAA;AAAA,GAAA;AAML,IAAM,mBAA2B;AACjC,IAAM,iBAAyB;AAG/B,IAAK,aAAL,kBAAKC,gBAAL;AACH,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AAHQ,SAAAA;AAAA,GAAA;AAOL,IAAM,cAAsB;AAM5B,IAAM,aAAqB;AAI3B,IAAM,kCAAkC;;;ACjCxC,IAAM,wBAAiC;AAEvC,IAAM,wCAAgD;AACtD,IAAM,wCAAgD;;;ACd7D,IAAM,mBAAmB,IAAI,KAAK,KAAK,OAAO;AAC9C,IAAM,kBAAkB;AACxB,IAAM,SAAS;AAER,SAAS,cAAc,MAAgC;AAC1D,QAAM,MAAM,KAAK;AACjB,MAAI,QAAQ,GAAG;AACX,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACvC;AACA,QAAM,QAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK,iBAAiB;AAC3C,QAAI,MAAM,IAAI;AACd,QAAI,MAAM,KAAK;AACX,YAAM;AAAA,IACV;AACA,UAAM,OAAO,aAAa,KAAK,SAAS,GAAG,GAAG,CAAC;AAC/C,UAAM,KAAK,IAAI;AAAA,EACnB;AACA,SAAO;AACX;AAEO,SAAS,aAAa,MAA8B;AACvD,MAAI,KAAK,SAAS,iBAAiB;AAC/B,UAAM,IAAI,MAAM,4CAA4C,KAAK,MAAM,EAAE;AAAA,EAC7E;AAEA,QAAM,IAAI,IAAI,WAAW,SAAS,EAAE,KAAK,CAAC;AAC1C,MAAI,aAAa;AAGjB,QAAM,QAAQ,MAAc;AACxB,QAAI,cAAc,KAAK,QAAQ;AAC3B,aAAO;AAAA,IACX;AACA,UAAM,MAAM,KAAK,UAAU;AAC3B,kBAAc;AACd,WAAO;AAAA,EACX;AAEA,MAAI,cAAc;AAClB,QAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,QAAM,SAAS,IAAI,WAAW,EAAE;AAEhC,QAAM,SAAS,MAAY;AACvB,QAAI,cAAc,KAAK,QAAQ;AAC3B,WAAK,OAAO,GAAG,QAAQ,CAAC;AACxB;AAAA,IACJ;AAEA,UAAM,IAAI,KAAK,OAAO,GAAG,MAAM,UAAU;AACzC,SAAK,OAAO,GAAG,QAAQ,CAAC;AACxB,kBAAc;AAAA,EAClB;AAIA,QAAM,SAAS,CAAC,MAAoB;AAChC,QAAI,cAAc,OAAO,GAAG;AACxB,YAAM,IAAI,MAAM,6CAA6C,WAAW,EAAE;AAAA,IAC9E;AAEA,UAAM,MAAM,IAAI;AAChB,QAAI,QAAQ,GAAG;AACX,YAAM,IAAI,MAAM,yCAAyC,EAAE,SAAS,CAAC,CAAC,EAAE;AAAA,IAC5E;AACA,MAAE,WAAW,IAAI;AACjB,mBAAe;AAAA,EACnB;AAGA,QAAM,UAAU,MAAY;AACxB,QAAI,cAAc,OAAO,GAAG;AACxB,YAAM,IAAI,MAAM,gDAAgD,WAAW,EAAE;AAAA,IACjF;AAEA,SAAK,GAAG,aAAa,OAAO,CAAC;AAC7B,mBAAe;AAAA,EACnB;AAEA,WAAS,QAAQ,GAAG,QAAQ,UAAU,aAAa,KAAK,QAAQ,SAAS;AAGrE,QAAI,UAAU,GAAG;AACb,YAAM,CAAC,IAAI;AAGX,YAAM,OAAO,KAAK;AAClB,YAAM,CAAC,IAAK,QAAQ,KAAM;AAC1B,YAAM,CAAC,IAAK,QAAQ,IAAK;AACzB,YAAM,CAAC,IAAI,OAAO;AAElB,oBAAc,KAAK,OAAO,GAAG,MAAM,CAAC;AAAA,IACxC,OAAO;AACH,aAAO;AAAA,IACX;AAEA,UAAM,IAAI,MAAM;AAChB,UAAM,IAAI,IAAI;AACd,WAAO,CAAC;AACR,YAAQ;AAER,WAAO;AACP,UAAM,IAAI,MAAM;AAChB,UAAM,IAAK,IAAI,MAAiB,IAAI,QAAgB;AACpD,WAAO,CAAC;AACR,YAAQ;AAER,WAAO;AACP,UAAM,IAAI,MAAM;AAChB,UAAM,IAAI,IAAI;AACd,WAAO,CAAC;AACR,YAAQ;AAER,WAAO;AACP,UAAM,KAAM,IAAI,QAAgB,KAAO,IAAI,QAAgB;AAC3D,WAAO,CAAC;AACR,YAAQ;AAAA,EACZ;AAEA,MAAI,aAAa,KAAK,QAAQ;AAC1B,UAAM,IAAI,MAAM,iDAAiD,UAAU,WAAW,IAAI,EAAE;AAAA,EAChG;AACA,SAAO;AACX;;;AC/HA,SAAS,UAAAC,eAAc;AACvB,SAAS,aAAa;AACtB,SAAS,WAAW;AAIb,IAAM,eAAN,MAAmB;AAAA,EAMtB,YAAY,KAAa,IAAY;AACjC,SAAK,WAAW,IAAIC,QAAO,gBAAgB,GAAG;AAC9C,SAAK,SAAS,IAAIA,QAAO,OAAO,IAAI,KAAK,QAAQ;AACjD,SAAK,QAAQ,IAAI,MAAM;AACvB,SAAK,MAAM,IAAI,IAAI;AAAA,EACvB;AAAA,EAEA,MAAM,kBAAmC;AACrC,UAAM,WAAW,MAAM,KAAK,SAAS,KAAK,mBAAmB,CAAC,CAAC;AAC/D,QAAI,CAAC,UAAU;AACX,YAAM,IAAI,MAAM,6CAA6C;AAAA,IACjE;AACA,WAAO,OAAO,QAAQ,IAAI,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,cAAuC;AACzC,WAAO,MAAM,KAAK,SAAS,WAAW;AAAA,EAC1C;AAAA,EAEA,MAAM,OACF,IACA,QAA6B,MAC7B,cAAmC,MACA;AACnC,WAAO,MAAM,KAAK,KAAK,IAAI,OAAO,OAAO,aAAa,KAAK;AAAA,EAC/D;AAAA,EAEA,MAAM,WACF,IACA,kBACA,QAA6B,MAC7B,cAAmC,MACA;AACnC,WAAO,MAAM,KAAK,KAAK,IAAI,kBAAkB,OAAO,aAAa,IAAI;AAAA,EACzE;AAAA,EAEA,MAAc,KACV,IACA,kBACA,QAA6B,MAC7B,cAAmC,MACnC,SAAkB,OACiB;AACnC,QAAI,kBAAkB;AAClB,SAAG,QAAQ,MAAM,KAAK,SAAS,oBAAoB,KAAK,OAAO,SAAS,QAAQ;AAAA,IACpF;AAEA,QAAI,CAAC,OAAO;AACR,aAAO,SAAS,MAAM,KAAK,SAAS,EAAE,IAAI,MAAM,KAAK,OAAO,gBAAgB,EAAE;AAAA,IAClF;AAGA,UAAM,kBAAkB,eAAe,YAAY,WAAW,MAAM,SAC9D,cACA,MAAM,KAAK,IAAI,uBAAuB,KAAK;AACjD,UAAM,SAAS,MAAM,KAAK,IAAI,kBAAkB,OAAO,eAAe;AAEtE,UAAM,cAAiC,MAAM,IAAI,CAAC,MAAM,OAAO;AAAA,MAC3D,MAAM;AAAA,MACN,OAAO,OAAO,CAAC;AAAA,MACf,YAAY,gBAAgB,CAAC;AAAA,IACjC,EAAE;AAEF,UAAM,kBAAkB,gBAAgB;AAAA,MAAI,gBACxCA,QAAO,QAAQ,+BAA+B,UAAU,CAAC;AAAA,IAC7D;AAEA,OAAG,qBAAH,GAAG,mBAAqB,MAAM,KAAK,gBAAgB;AAGnD,OAAG,OAAO;AACV,OAAG,sBAAsB;AACzB,OAAG,QAAQ;AACX,WAAO,SAAS,MAAM,KAAK,SAAS,EAAE,IAAI,MAAM,KAAK,OAAO,gBAAgB,EAAE;AAAA,EAClF;AAAA,EAEA,MAAc,SAAS,IAAoE;AACvF,UAAM,UAAU,MAAM,KAAK,MAAM,QAAQ;AACzC,QAAI;AACA,aAAO,MAAM,KAAK,OAAO,gBAAgB,EAAE;AAAA,IAC/C,UAAE;AACE,cAAQ;AAAA,IACZ;AAAA,EACJ;AAAA,EAEA,MAAM,2BAA2B,OAA4C;AACzE,WAAO,MAAM,KAAK,IAAI,uBAAuB,KAAK;AAAA,EACtD;AAAA,EAEA,MAAM,gCAAgC,OAAwC;AAC1E,UAAM,cAAc,MAAM,KAAK,2BAA2B,KAAK;AAC/D,WAAO,0BAA0B,WAAW;AAAA,EAChD;AAAA,EAEA,MAAM,qBAAqB,MAAqC;AAC5D,UAAM,aAAa,MAAM,KAAK,SAAS,eAAe,IAAI;AAC1D,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,cAAc;AAE/C,UAAM,YAAY,MAAM,WAAW,KAAK;AACxC,UAAM,SAAS,WAAW,SAAS;AACnC,WAAO;AAAA,MACH;AAAA,MACA,SAAS,WAAW,WAAW;AAAA,IACnC;AAAA,EACJ;AAAA,EAEA,MAAM,QAAuB;AACzB,UAAM,KAAK,IAAI,MAAM;AAAA,EACzB;AACJ;;;ACrHA,eAAsB,cAAc,UAAoB,SAAiB,SAAyC;AAC9G,QAAM,SAAS,MAAM,MAAM,MAAM,SAAS,eAAe,EAAE,OAAO,GAAG,OAAO;AAC5E,SAAO;AAAA,IACH,UAAU,OAAO,OAAO,CAAC,CAAC;AAAA,IAC1B,eAAe,OAAO,OAAO,CAAC,CAAC;AAAA,IAC/B,MAAM,OAAO,CAAC;AAAA,EAClB;AACJ;AAEA,eAAsB,eAAe,UAAoB,OAAiB,SAA8C;AACpH,QAAM,QAAQ,MAAM,IAAI,SAAO,YAAY,GAAG,CAAC;AAC/C,QAAM,SAAS,MAAM,MAAM,MAAM,SAAS,qBAAqB,EAAE,KAAK,GAAG,OAAO;AAChF,QAAM,UAA8B,CAAC;AACrC,MAAI,QAAQ;AACZ,aAAW,OAAO,OAAO;AACrB,YAAQ,KAAK,EAAE,KAAK,YAAY,OAAO,OAAO,OAAO,CAAC,EAAE,CAAC;AAAA,EAC7D;AACA,SAAO;AACX;AAEA,eAAsB,eAAe,UAAoB,OAAoB,SAA6C;AACtH,QAAM,aAAa,MAAM,IAAI,UAAQ;AAAA,IACjC,YAAY,KAAK,IAAI;AAAA,IACrB,KAAK;AAAA,EACT,CAAC;AAED,QAAM,SAAS,MAAM,MAAM,MAAM,SAAS,qBAAqB,EAAE,UAAU,GAAG,OAAO;AACrF,QAAM,UAA6B,CAAC;AACpC,MAAI,QAAQ;AACZ,aAAW,QAAQ,OAAO;AACtB,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC3C,cAAQ,KAAsB,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,SAAS,CAAC,GAAG,MAAM,OAAO,OAAO,EAAE,CAAC;AAAA,IACvG;AAAA,EACJ;AACA,SAAO;AACX;;;ACvCA,SAAS,UAAAC,eAAc;AAmBhB,IAAM,aAAN,MAAM,YAAW;AAAA,EAOpB,aAAa,OAAO,QAAmB;AACnC,UAAM,aAAa,IAAI,YAAW;AAClC,UAAM,WAAW,KAAK,MAAM;AAC5B,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,KAAK,QAAmB;AAClC,UAAM,EAAE,KAAK,YAAY,eAAe,QAAQ,IAAI;AACpD,QAAI,SAAS;AACT,WAAK,eAAe;AAAA,IACxB,WAAW,KAAK;AACZ,YAAM,UAAU,MAAM,WAAW,GAAG;AACpC,WAAK,eAAe,mBAAmB,OAAO;AAAA,IAClD;AACA,QAAI,CAAC,KAAK,cAAc;AACpB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC5D;AAEA,SAAK,gBAAgB;AAErB,QAAI,cAAc,KAAK;AACnB,YAAM,WAAW,IAAIC,QAAO,gBAAgB,GAAG;AAC/C,WAAK,SAAS,IAAIA,QAAO,OAAO,YAAY,QAAQ;AACpD,WAAK,eAAe,IAAI,aAAa,KAAK,UAAU;AAAA,IACxD;AAAA,EACJ;AAAA,EAEA,MAAM,aAAa,KAAa,MAAyC;AACrE,SAAK,UAAU,IAAI;AACnB,UAAM,SAASA,QAAO,UAAU,YAAY,GAAG,CAAC;AAChD,UAAM,WAAW,IAAIA,QAAO,SAAS,KAAK,cAAc,eAAe,KAAK,OAAO;AACnF,UAAM,CAAC,aAAa,kBAAkB,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClE,SAAS,gBAAgB,EAAE;AAAA,MAC3B,KAAK,cAAc,gBAAgB;AAAA,MACnC,KAAK,cAAc,YAAY;AAAA,IACnC,CAAC;AAED,UAAM,WAAW,MAAM,SAAS,SAAS,EAAE,YAAY,QAAQ,GAAG,KAAK,QAAQ;AAAA,MAC3E,OAAO;AAAA;AAAA,MAEP,qBAAqB,CAAC,+BAA+B;AAAA,IACzD,CAAC;AAGD,UAAM,gBAAgB,WAAW,eAAgB,WAAW,wBAAyB;AACrF,UAAM,mBAAmB,mBAAmB,OAAO,SAAS;AAC5D,UAAM,UAAU,eAAe;AAC/B,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,MAAM,KAAa,MAA+D;AACpF,SAAK,UAAU,IAAI;AAEnB,UAAM,WAAW,IAAIA,QAAO,SAAS,KAAK,cAAc,eAAe,KAAK,OAAO;AACnF,UAAM,SAASA,QAAO,UAAU,YAAY,GAAG,CAAC;AAChD,QAAI;AACA,YAAM,cAAc,MAAM,SAAS,gBAAgB,EAAE;AACrD,YAAM,KAAK,MAAM,SAAS,SAAS,EAAE,oBAAoB,QAAQ,GAAG,KAAK,QAAQ;AAAA,QAC7E,OAAO;AAAA,MACX,CAAC;AAED,YAAM,QAAQ,cAAc,IAAI;AAChC,YAAM,QAAQ,MAAM,KAAK,cAAc,OAAO,IAAI,KAAK;AACvD,cAAQ,IAAI,0BAA0B,MAAM,IAAI,EAAE;AAClD,YAAM,UAAU,MAAM,MAAM,KAAK;AACjC,aAAO,EAAE,MAAM,MAAM,MAAM,SAAS,SAAS,WAAW,EAAE;AAAA,IAC9D,SAAS,GAAG;AACR,cAAQ,MAAM,kCAAmC,EAAY,OAAO;AAAA,IACxE;AACA,WAAO,EAAE,MAAM,MAAM,SAAS,MAAM;AAAA,EACxC;AAAA,EAEA,MAAM,KACF,KACA,sCACA,SACmB;AACnB,QAAI,CAAC,KAAK;AACN,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC9C;AACA,UAAM,cAAc,KAAK,QAAQ,WAAW;AAC5C,QAAI,CAAC,aAAa;AACd,YAAM,IAAI,MAAM,gFAAgF;AAAA,IACpG;AAEA,UAAM,SAASA,QAAO,UAAU,YAAY,GAAG,CAAC;AAChD,UAAM,WAAW,IAAIA,QAAO,gBAAgB,KAAK,cAAc;AAC/D,UAAM,WAAW,IAAIA,QAAO,SAAS,KAAK,cAAc,eAAe,QAAQ;AAC/E,UAAM,OAAO,MAAM,SAAS,KAAK,QAAQ;AAAA,MACrC,MAAM;AAAA,IACV,CAAC;AACD,QAAI,SAAS,IAAI;AACb,YAAM,IAAI,MAAM,qDAAqD,GAAG,yBAAyB,WAAW,GAAG;AAAA,IACnH;AACA,UAAM,OAAO,MAAM,SAAS,IAAI,QAAQ,YAAY,GAAG,MAAM;AAAA,MACzD,MAAM;AAAA,IACV,CAAC;AACD,WAAOA,QAAO,SAAS,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAM,WAAW,MAAgB,WAAsE;AACnG,QAAI,CAAC,QAAQ,CAAC,WAAW;AACrB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IACpD;AACA,QAAI,KAAK,WAAW,UAAU,QAAQ;AAClC,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC7E;AACA,QAAI,KAAK,SAAS,kBAAkB;AAChC,YAAM,IAAI,MAAM,uDAAuD;AAAA,IAC3E;AAEA,UAAM,aAAa,KAAK;AACxB,UAAM,UAAU,CAAC;AACjB,UAAM,SAAS,CAAC;AAChB,UAAM,QAAQ,CAAC;AACf,UAAM,YAAY,CAAC;AACnB,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACjC,YAAM,OAAO,UAAU,CAAC;AACxB,WAAK,UAAU,IAAI;AACnB,YAAM,OAAO,cAAc,IAAI;AAC/B,cAAQ,KAAK,KAAK,CAAC,CAAC;AACpB,aAAO,KAAKA,QAAO,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC;AAClD,YAAM,KAAK,CAAC;AACZ,gBAAU,KAAK,KAAK,MAAM;AAAA,IAC9B;AAEA,UAAM,WAAW,IAAIA,QAAO,SAAS,KAAK,cAAc,eAAe,KAAK,OAAO;AACnF,QAAI;AACA,YAAM,cAAc,MAAM,SAAS,gBAAgB,EAAE;AACrD,YAAM,KAAK,MAAM,SAAS,UAAU,EAAE,oBAAoB,QAAQ,OAAO,WAAW;AAAA,QAChF,OAAO,cAAc,OAAO,UAAU;AAAA,MAC1C,CAAC;AAED,YAAM,QAAQ,MAAM,KAAK,cAAc,OAAO,IAAI,OAAO;AACzD,cAAQ,IAAI,0BAA0B,MAAM,IAAI,EAAE;AAClD,YAAM,UAAU,MAAM,MAAM,KAAK;AACjC,aAAO,EAAE,MAAM,MAAM,MAAM,SAAS,SAAS,WAAW,EAAE;AAAA,IAC9D,SAAS,GAAG;AACR,cAAQ,MAAM,iCAAkC,EAAY,OAAO;AAAA,IACvE;AACA,WAAO,EAAE,MAAM,MAAM,SAAS,MAAM;AAAA,EACxC;AAAA,EAEA,MAAM,QAAuB;AACzB,QAAI,KAAK,cAAc;AACnB,YAAM,KAAK,aAAa,MAAM;AAAA,IAClC;AAAA,EACJ;AAAA;AAAA,EAGA,IAAY,UAAyB;AACjC,QAAI,CAAC,KAAK,QAAQ;AACd,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC7E;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAY,gBAA8B;AACtC,QAAI,CAAC,KAAK,cAAc;AACpB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACnE;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAY,iBAAyB;AACjC,QAAI,CAAC,KAAK,eAAe;AACrB,YAAM,IAAI,MAAM,iEAAiE;AAAA,IACrF;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAGQ,UAAU,MAA+B;AAC7C,QAAI,CAAC,MAAM;AACP,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AACA,QAAI,KAAK,WAAW,KAAK,KAAK,SAAS,mBAAmB;AACtD,YAAM,IAAI,MAAM,kEAAkE,iBAAiB,GAAG;AAAA,IAC1G;AAAA,EACJ;AACJ;;;ACjNA,OAAO,YAAY;AACnB,SAAS,UAAAC,eAAc;AAwBvB,IAAM,kBAAoC;AAAA,EACtC,YAAY,MAAM;AAAA,EAAE;AAAA,EACpB,QAAQ,MAAM;AAAA,EAAE;AAAA,EAChB,UAAU,MAAM;AAAA,EAAE;AACtB;AA7BA;AA+BO,IAAM,iBAAN,MAAM,eAAc;AAAA,EAApB;AAAA;AAQH,SAAQ,UAAkB;AAC1B,SAAO,gBAAyB;AAEhC,SAAQ,aAAsB;AAAA;AAAA,EAE9B,aAAa,OAAO,QAAmB;AACnC,UAAM,gBAAgB,IAAI,eAAc;AACxC,UAAM,cAAc,KAAK,MAAM;AAC/B,WAAO;AAAA,EACX;AAAA,EAEA,cAAc,OAAgB;AAC1B,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,MAAM,KAAK,QAAmB;AAC1B,UAAM,EAAE,YAAY,KAAK,SAAS,cAAc,IAAI;AACpD,SAAK,MAAM;AACX,SAAK,eAAe;AACpB,SAAK,gBAAgB;AAErB,QAAI,cAAc,KAAK;AAEnB,YAAMC,YAAW,IAAIC,QAAO,gBAAgB,GAAG;AAC/C,WAAK,SAAS,IAAIA,QAAO,OAAO,YAAYD,SAAQ;AACpD,WAAK,eAAe,IAAI,aAAa,KAAK,UAAU;AACpD,UAAI,CAAC,QAAS;AAAA,IAClB,WAAW,CAAC,iBAAiB,CAAC,SAAS;AAEnC,YAAM,IAAI,MAAM,2EAA2E;AAAA,IAC/F;AAGA,UAAM,WAAW,OAAO;AACxB,UAAM,WAAW,IAAIC,QAAO,gBAAgB,QAAS;AACrD,UAAM,eAAe,IAAIA,QAAO,SAAS,SAAS,kBAAkB,QAAQ;AAC5E,UAAM,CAAC,aAAa,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MACrD,MAAM,MAAM,aAAa,eAAe,EAAE,GAAG,KAAK,OAAO,EAAE,MAAM,CAAC,MAAM;AACpE,YAAI,GAAG,SAAS,WAAY,QAAO;AACnC,cAAM;AAAA,MACV,CAAC;AAAA,MACD,MAAM,MAAM,aAAa,SAAS,EAAE,GAAG,KAAK,OAAO,EAAE,MAAM,CAAC,MAAM;AAC9D,YAAI,GAAG,SAAS,WAAY,QAAO;AACnC,cAAM;AAAA,MACV,CAAC;AAAA,IACL,CAAC;AACD,QAAI,oBAAoB,uCAAuC;AAE3D,YAAM,KAAK,MAAM;AAEjB,UAAI;AACJ,UAAI,oBAAoB,uCAAuC;AAC3D,wBAAgB;AAAA,MACpB,OAAO;AACH,wBAAgB;AAAA,MACpB;AACA,YAAM,IAAI;AAAA,QACN,4EAA4E,eAAe;AAAA;AAAA;AAAA,WAG/E,aAAa;AAAA,MAC7B;AAAA,IACJ;AACA,SAAK,gBAAgB;AAAA,EACzB;AAAA,EAEA,MAAM,SAAiC;AACnC,UAAM,UAAU,MAAM,WAAW,KAAK,IAAI;AAC1C,SAAK,gBAAgB,mBAAmB,OAAO,KAAK;AAEpD,UAAM,aAAa,mBAAmB,OAAO,KAAK;AAClD,UAAM,UAAU,IAAIA,QAAO,gBAAgB,kBAAkB,uBAAuB,KAAK,OAAO;AAChG,QAAI;AAEA,YAAM,WAAW,MAAM,QAAQ,OAAO,GAAG,mBAAmB,YAAY,EAAC,UAAU,KAAO,CAAC;AAC3F,YAAM,SAAS,kBAAkB;AAEjC,WAAK,eAAe,MAAM,SAAS,WAAW;AAC9C,4BAAK,kCAAL,WAAU,8CAA8C,KAAK,YAAY;AACzE,aAAO,KAAK;AAAA,IAChB,SAAS,GAAG;AACR,4BAAK,kCAAL,WAAU,sBAAuB,EAAU,WAAW,CAAC,IAAI;AAC3D,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,WAAW,UAAoC;AACjD,UAAM,UAAU,WAAW,YAAY,QAAQ,IAAI;AACnD,UAAM,eAAe,IAAIA,QAAO,SAAS,KAAK,eAAe,kBAAkB,KAAK,OAAO;AAC3F,QAAI;AACA,YAAM,KAAK,MAAM,aAAa,WAAW,OAAO;AAChD,4BAAK,kCAAL,WAAU,8BAA8B,QAAQ,8BAA8B,GAAG,IAAI;AACrF,YAAM,YAAY,MAAM,GAAG,KAAK;AAChC,aAAO,UAAU,WAAW;AAAA,IAChC,SAAS,GAAG;AACR,4BAAK,kCAAL,WAAU,oCAAoC,QAAQ,MAAO,EAAU,WAAW,CAAC,IAAI;AAAA,IAC3F;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,OAAO,KAA+B;AACxC,UAAM,eAAe,IAAIA,QAAO,SAAS,KAAK,eAAe,kBAAkB,KAAK,OAAO;AAC3F,QAAI;AACA,YAAM,KAAK,MAAM,aAAa,OAAO,YAAY,GAAG,CAAC;AACrD,4BAAK,kCAAL,WAAU,gCAAgC,GAAG,YAAY,GAAG,IAAI;AAChE,YAAM,UAAU,MAAM,GAAG,KAAK;AAC9B,aAAO,QAAQ,WAAW;AAAA,IAC9B,SAAS,GAAG;AACR,4BAAK,kCAAL,WAAU,+BAA+B,GAAG,MAAO,EAAU,WAAW,CAAC,IAAI;AAAA,IACjF;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,SAAS,KAAa,KAAuB,iBAAiB;AAChE,UAAM,UAAU,YAAY,GAAG;AAC/B,UAAM,WAAW,IAAIA,QAAO,gBAAgB,KAAK,cAAc;AAC/D,UAAM,WAAW,IAAIA,QAAO,SAAS,KAAK,eAAe,kBAAkB,QAAQ;AACnF,QAAI;AACA,YAAM,SAAS,MAAM,eAAe,UAAU,CAAC,GAAG,GAAG,KAAK,OAAO;AACjE,YAAM,cAAc,OAAO,CAAC,EAAE;AAC9B,UAAI,gBAAgB,GAAG;AACnB,WAAG,SAAS;AACZ;AAAA,MACJ;AAEA,YAAM,sBAAK,uCAAL,WAAe,UAAU,SAAS,aAAa;AACrD,SAAG,SAAS;AAAA,IAChB,SAAS,KAAK;AACV,SAAG,OAAO,GAAY;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEA,MAAM,YAAY,MAAmD;AACjE,QAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC/B,YAAM,IAAI,MAAM,eAAe;AAAA,IACnC;AAGA,UAAM,WAAW,IAAIA,QAAO,SAAS,KAAK,eAAe,kBAAkB,KAAK,OAAO;AACvF,UAAM,YAAY,MAAM,eAAe,UAAU,MAAM,KAAK,OAAO;AACnE,WAAO,sBAAK,0CAAL,WAAkB;AAAA,EAC7B;AAAA,EAEA,MAAM,aAAa,SAAoD;AACnE,UAAM,EAAE,KAAK,KAAK,IAAI;AACtB,QAAI,CAAC,KAAK;AACN,YAAM,IAAI,MAAM,6BAA6B;AAAA,IACjD;AAEA,QAAI,uBAA0B;AAC1B,aAAO,MAAM,sBAAK,iDAAL,WAAyB;AAAA,IAC1C,OAAO;AACH,aAAO,MAAM,sBAAK,qDAAL,WAA6B;AAAA,IAC9C;AAAA,EACJ;AAAA,EAEA,MAAM,OAAO,SAAuC;AAChD,UAAM,EAAE,KAAK,UAAU,KAAK,IAAI;AAChC,QAAI,CAAC,UAAU;AACX,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC7D;AACA,QAAI,CAAC,KAAK;AACN,eAAS,OAAQ,IAAI,MAAM,6BAA6B,CAAC;AACzD,eAAS,SAAU,GAAG,GAAG,EAAE;AAC3B;AAAA,IACJ;AACA,QAAI,CAAC,KAAK,cAAc;AACpB,eAAS,OAAQ,IAAI,MAAM,4CAA4C,CAAC;AACxE,eAAS,SAAU,GAAG,GAAG,EAAE;AAC3B;AAAA,IACJ;AACA,QAAI,CAAC,KAAK,QAAQ;AACd,eAAS,OAAQ,IAAI,MAAM,4DAA4D,CAAC;AACxF,eAAS,SAAU,GAAG,GAAG,EAAE;AAC3B;AAAA,IACJ;AAEA,QAAI,uBAA0B;AAC1B,YAAM,sBAAK,2CAAL,WAAmB;AAAA,IAC7B,OAAO;AACH,YAAM,sBAAK,+CAAL,WAAuB;AAAA,IACjC;AAAA,EACJ;AAAA,EAEA,MAAM,QAAuB;AACzB,QAAI,KAAK,cAAc;AACnB,YAAM,KAAK,aAAa,MAAM;AAAA,IAClC;AAAA,EACJ;AAAA;AAAA,EAmhBA,IAAY,gBAAwB;AAChC,QAAI,CAAC,KAAK,aAAc,OAAM,IAAI,MAAM,8BAA8B;AACtE,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAY,iBAAyB;AACjC,QAAI,CAAC,KAAK,cAAe,OAAM,IAAI,MAAM,0CAA0C;AACnF,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAY,OAAe;AACvB,QAAI,CAAC,KAAK,IAAK,OAAM,IAAI,MAAM,gCAAgC;AAC/D,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAY,UAAyB;AACjC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AACxE,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAY,gBAA8B;AACtC,QAAI,CAAC,KAAK,aAAc,OAAM,IAAI,MAAM,+CAA+C;AACvF,WAAO,KAAK;AAAA,EAChB;AACJ;AA/uBO;AAwMG,cAAS,eACX,UACA,SACA,aACA,IACF;AAEE,QAAM,oBAAoB,oBAAI,IAAwB;AACtD,MAAI,oBAAoB;AACxB,QAAM,mBAAmB,MAAM;AAC3B,WAAO,kBAAkB,IAAI,iBAAiB,GAAG;AAC7C,YAAM,OAAO,kBAAkB,IAAI,iBAAiB;AACpD,SAAG,WAAW,mBAAmB,aAAa,IAAI;AAClD,wBAAkB,OAAO,iBAAiB;AAC1C;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,cAAc,OAAO,MAAc;AACrC,UAAM,CAAC,IAAI,IAAI,MAAM,SAAS,WAAW,EAAE,SAAS,CAAC;AACrD,sBAAkB,IAAI,GAAGA,QAAO,SAAS,IAAI,CAAC;AAC9C,qBAAiB;AAAA,EACrB;AAGA,MAAI;AACJ,MAAI,OAAO,WAAW,eAAe,OAAO,cAAc,aAAa;AACnE,8BAA0B;AAAA,EAC9B,WAAW,OAAO,YAAY,eAAe,QAAQ,UAAU,MAAM;AACjE,QAAI;AACA,YAAM,KAAK,MAAM,OAAO,IAAI;AAC5B,YAAM,QAAQ,GAAG,KAAK,EAAE;AACxB,gCAA0B,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC,CAAC;AAAA,IACjE,SAAS,KAAK;AACV,gCAA0B;AAAA,IAC9B;AAAA,EACJ,OAAO;AACH,8BAA0B;AAAA,EAC9B;AACA,QAAM,QAAQ,OAAO,uBAAuB;AAC5C,QAAM,SAAS,MAAM;AAAA,IAAK,EAAE,QAAQ,YAAY;AAAA,IAAG,CAAC,GAAG,MAC/C,MAAM,MAAM,MAAM,MAAM,YAAY,CAAC,GAAG,KAAK,OAAO,CAAC;AAAA,EACzD;AAEJ,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,CAAC,CAAC;AACvC,mBAAiB;AACrB;AAEM,iBAAY,eAAC,WAAkE;AACjF,QAAM,YAAsC,CAAC;AAE7C,QAAM,aAAyC,CAAC;AAChD,MAAI,eAAyC,CAAC;AAC9C,MAAI,oBAAoB;AACxB,aAAW,EAAE,KAAK,WAAW,KAAK,WAAW;AACzC,cAAU,GAAG,IAAI,eAAe,IAAI,CAAC,IAAI,IAAI,MAAM,UAAU;AAE7D,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACjC,UAAI,CAAC,aAAa,GAAG,GAAG;AACpB,qBAAa,GAAG,IAAI,CAAC;AAAA,MACzB;AACA,mBAAa,GAAG,EAAE,KAAK,CAAC;AACxB;AAEA,UAAI,sBAAsB,YAAY;AAClC,mBAAW,KAAK,YAAY;AAC5B,uBAAe,CAAC;AAChB,4BAAoB;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ;AACA,MAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACtC,eAAW,KAAK,YAAY;AAAA,EAChC;AAGA,MAAI,WAAW,SAAS,GAAG;AACvB,UAAM,WAAW,IAAIA,QAAO,SAAS,KAAK,cAAe,kBAAkB,KAAK,MAAO;AACvF,UAAM,cAAc,MAAM,QAAQ,IAAI,WAAW,IAAI,WAAS;AAC1D,YAAM,kBAA+B,OAAO,KAAK,KAAK,EAAE,IAAI,WAAS;AAAA,QACjE;AAAA,QACA,UAAU,MAAM,IAAI;AAAA,MACxB,EAAE;AACF,aAAO,eAAe,UAAU,iBAAiB,KAAK,OAAO;AAAA,IACjE,CAAC,CAAC;AAEF,gBAAY,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,SAAS,KAAK,MAAuB;AACrE,gBAAU,IAAI,EAAE,OAAO,IAAI;AAAA,IAC/B,CAAC;AAAA,EACL;AACA,SAAO;AACX;AAEM,wBAAmB,eAAC,SAAoD;AAC1E,MAAI,EAAE,KAAK,SAAS,aAAa,YAAY,EAAE,IAAI;AAEnD,MAAI,CAAC,KAAK,eAAe;AACrB,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC/E;AAGA,QAAM,aAAa,sBAAK,4CAAL,WAAoB;AACvC,MAAI,eAAe,IAAI;AACnB,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AAGA,QAAM,UAAU,YAAY,GAAG;AAC/B,QAAM,eAAe,IAAIA,QAAO,SAAS,KAAK,eAAe,kBAAkB,KAAK,OAAO;AAC3F,QAAM,EAAE,MAAM,eAAe,UAAU,kBAAkB,WAAW,IAAI,MAAM,sBAAK,kDAAL,WAA0B,cAAc;AACtH,MAAI,6BAAgC,gCAAmC;AACnE,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC5E;AAGA,MAAI,CAAC,aAAa;AACd,UAAM,SAAS,MAAM,sBAAK,0CAAL,WAAkB,CAAC,EAAE,KAAK,YAAY,cAAc,CAAC;AAC1E,kBAAc,OAAO,GAAG;AAAA,EAC5B;AAEA,MAAI,eAAe;AACnB,MAAI,mBAAmB;AACvB,MAAI,WAAW;AAEf,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK,gBAAgB;AACjD,UAAM,EAAE,SAAS,YAAY,aAAa,IAAI,MAAM,sBAAK,0CAAL,WAAkB,SAAS;AAE/E,QAAI,cAA+B;AAEnC,QAAI,IAAI,QAAQ,UAAU,YAAY,QAAQ;AAC1C,oBAAc,MAAM,KAAK,cAAc,gCAAgC,OAAO;AAC9E,YAAM,eAAe,YAAY,MAAM,GAAG,IAAI,YAAY,MAAM;AAChE,UAAI,KAAK,UAAU,WAAW,MAAM,KAAK,UAAU,YAAY,GAAG;AAC9D;AAAA,MACJ;AAAA,IACJ;AAIA,UAAM,QAAQ,OAAO,OAAO,QAAQ,MAAM;AAC1C,wBAAoB;AAEpB,QAAI,aAAa,IAAI;AAEjB,iBAAW,MAAM,MAAM,MAAM,aAAa,oBAAoB,EAAE,YAAY,SAAS,YAAY,cAAc;AAAA,QAC3G;AAAA,QACA,qBAAqB,IAAI,MAAM,QAAQ,MAAM,EAAE,KAAK,+BAA+B;AAAA,MACvF,CAAC,GAAG,KAAK,OAAO;AAAA,IACpB;AACA,UAAM,WAAW,WAAY,eAAgB,WAAY,wBAAyB,OAAO,QAAQ,IAC3F,mBAAoB,OAAO,SAAS;AAC1C,oBAAgB;AAAA,EACpB;AAEA,kBAAiB,eAAe,OAAO,SAAS,IAAK;AACrD,SAAO;AAAA,IACH,aAAa;AAAA,IACb,SAAS;AAAA,EACb;AACJ;AAEM,4BAAuB,eAAC,SAAoD;AAC9E,MAAI,EAAE,KAAK,SAAS,aAAa,YAAY,EAAE,IAAI;AAEnD,QAAM,EAAE,eAAe,YAAY,IAAI,sBAAK,6CAAL,WAAqB;AAC5D,MAAI,kBAAkB,IAAI;AACtB,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AAEA,QAAM,UAAU,YAAY,GAAG;AAC/B,QAAM,eAAe,IAAIA,QAAO,SAAS,KAAK,eAAe,kBAAkB,KAAK,OAAO;AAC3F,QAAM,EAAE,eAAe,UAAU,WAAW,IAAI,MAAM,sBAAK,sDAAL,WAA8B,cAAc;AAClG,MAAI,iCAAoC,gCAAmC;AACvE,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAChF;AAGA,MAAI,CAAC,aAAa;AACd,UAAM,SAAS,MAAM,sBAAK,0CAAL,WAAkB,CAAC,EAAE,KAAK,YAAY,cAAc,CAAC;AAC1E,kBAAc,OAAO,GAAG;AAAA,EAC5B;AAEA,MAAI,eAAe;AACnB,MAAI,WAAW;AACf,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,UAAM,QAAQ,MAAM,gBAAgB,SAAS,IAAI,gBAAgB,IAAI,KAAK,aAAa;AAGvF,QAAI,IAAI,YAAY,UAAUA,QAAO,UAAU,KAAK,MAAM,YAAY,CAAC,GAAG;AACtE;AAAA,IACJ;AAGA,QAAI,MAAM,cAAc,KAAK,aAAa,IAAI;AAC1C,YAAM,UAAUA,QAAO,QAAQ,KAAK;AACpC,iBAAW,MAAM,MAAM,MAAM,aAAa,sBAAsB,EAAE,YAAY,SAAS,GAAG,OAAO,GAAG,KAAK,OAAO;AAAA,IACpH;AACA,qBAAiB,WAAY,eAAgB,WAAY,wBAAyB;AAAA,EACtF;AACA,kBAAiB,eAAe,OAAO,SAAS,IAAK;AAErD,SAAO;AAAA,IACH,aAAa;AAAA,IACb,SAAS;AAAA,EACb;AACJ;AAEM,kBAAa,eAAC,SAAuC;AACvD,MAAI,oBAAoB,GAAG,kBAAkB;AAC7C,MAAI,YAAY;AAEhB,MAAI,EAAE,KAAK,SAAS,UAAU,aAAa,YAAY,GAAG,mBAAmB,MAAM,IAAI;AACvF,MAAI,CAAC,KAAK,eAAe;AACrB,aAAS,SAAS,IAAI,MAAM,2DAA2D,CAAC;AACxF,aAAS,WAAW,mBAAmB,iBAAiB,SAAS;AACjE;AAAA,EACJ;AAEA,QAAM,aAAa,sBAAK,4CAAL,WAAoB;AACvC,MAAI,eAAe,IAAI;AACnB,aAAS,SAAS,IAAI,MAAM,wCAAwC,CAAC;AACrE,aAAS,WAAW,mBAAmB,iBAAiB,SAAS;AACjE;AAAA,EACJ;AAEA,QAAM,UAAU,YAAY,GAAG;AAC/B,QAAM,eAAe,IAAIA,QAAO,SAAS,KAAK,cAAe,kBAAkB,KAAK,MAAO;AAC3F,QAAM,EAAE,MAAM,eAAe,SAAS,IAAI,MAAM,sBAAK,4CAAL,WAAoB,cAAc;AAClF,MAAI,6BAAgC,gCAAmC;AACnE,aAAS,OAAQ,IAAI,MAAM,wDAAwD,CAAC;AACpF,aAAS,SAAU,mBAAmB,iBAAiB,SAAS;AAChE;AAAA,EACJ;AAEA,QAAM,aAAa,MAAM,MAAM,MAAM,sBAAK,2CAAL,WAAmB,cAAc,SAAS,YAAY,gBAAgB,KAAK,OAAO;AACvH,MAAI,CAAC,YAAY;AACb,aAAS,OAAQ,IAAI,MAAM,6CAA6C,CAAC;AACzE,aAAS,SAAU,mBAAmB,iBAAiB,SAAS;AAChE;AAAA,EACJ;AAGA,MAAI,CAAC,aAAa;AACd,UAAM,SAAS,MAAM,sBAAK,0CAAL,WAAkB,CAAC,EAAE,KAAK,YAAY,cAAc,CAAC;AAC1E,kBAAc,OAAO,GAAG;AAAA,EAC5B;AAGA,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK,gBAAgB;AACjD,UAAM;AAAA,MACF;AAAA,MAAS;AAAA,MAAY;AAAA,IACzB,IAAI,MAAM,sBAAK,0CAAL,WAAkB,SAAS;AACrC,UAAM,oBAAoB,MAAM,KAAK,cAAc,2BAA2B,OAAO;AAGrF,QAAI,IAAI,QAAQ,UAAU,YAAY,QAAQ;AAC1C,YAAM,eAAe,0BAA0B,iBAAiB;AAChE,YAAM,eAAe,YAAY,MAAM,GAAG,IAAI,aAAa,MAAM;AACjE,UAAI,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,GAAG;AAC/D,iBAAS,WAAY,WAAW,WAAW,SAAS,CAAC,GAAG,YAAY,KAAK;AACzE;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,aAAa,MAAM,MAAM,MAAM,sBAAK,yCAAL,WAAiB,cAAc,KAAK,SAAS,SAC9E,mBAAmB,YAAY,cAAc,MAAM,WAAW,kBAAkB,WAA6B,KAAK,OAAO;AAC7H,UAAM,eAAe,MAAM,MAAM,MAAM,KAAK,cAAc,qBAAqB,WAAW,IAAI,GAAG,KAAK,OAAO;AAG7G,iBAAa,OAAO,OAAO,QAAQ,MAAM;AACzC,iBAAa,aAAa,OAAO,gBAAgB,aAAa,OAAO;AAGrE,QAAI,CAAC,aAAa,SAAS;AACvB,eAAS,OAAQ,IAAI,MAAM,4CAA4C,CAAC;AACxE;AAAA,IACJ;AAEA,aAAS,WAAY,WAAW,WAAW,SAAS,CAAC,GAAG,YAAY,IAAI;AACxE,yBAAqB,QAAQ;AAC7B,uBAAmB,aAAa,OAAO,CAAC,KAAa,SAAiB,MAAM,MAAM,CAAC;AAAA,EACvF;AAEA,WAAS,SAAU,mBAAmB,iBAAiB,SAAS;AACpE;AAEM,sBAAiB,eAAC,SAAuC;AAC3D,MAAI,oBAAoB,GAAG,kBAAkB;AAC7C,MAAI,YAAY;AAEhB,MAAI,EAAE,KAAK,SAAS,UAAU,aAAa,YAAY,GAAG,mBAAmB,MAAM,IAAI;AAEvF,QAAM,EAAE,eAAe,YAAY,IAAI,sBAAK,6CAAL,WAAqB;AAC5D,MAAI,kBAAkB,IAAI;AACtB,aAAS,OAAQ,IAAI,MAAM,wCAAwC,CAAC;AACpE,aAAS,SAAU,mBAAmB,iBAAiB,SAAS;AAChE;AAAA,EACJ;AAEA,QAAM,UAAU,YAAY,GAAG;AAC/B,QAAM,eAAe,IAAIA,QAAO,SAAS,KAAK,cAAe,kBAAkB,KAAK,MAAO;AAC3F,QAAM,EAAE,eAAe,SAAS,IAAI,MAAM,sBAAK,4CAAL,WAAoB,cAAc;AAC5E,MAAI,iCAAoC,gCAAmC;AACvE,aAAS,OAAQ,IAAI,MAAM,4DAA4D,CAAC;AACxF,aAAS,SAAU,mBAAmB,iBAAiB,SAAS;AAChE;AAAA,EACJ;AAGA,QAAM,aAAa,MAAM,MAAM,MAAM,sBAAK,2CAAL,WAAmB,cAAc,SAAS,aAAa,gBAAgB,KAAK,OAAO;AACxH,MAAI,CAAC,YAAY;AACb,aAAS,OAAQ,IAAI,MAAM,6CAA6C,CAAC;AACzE,aAAS,SAAU,mBAAmB,iBAAiB,SAAS;AAChE;AAAA,EACJ;AAGA,MAAI,CAAC,aAAa;AACd,UAAM,SAAS,MAAM,sBAAK,0CAAL,WAAkB,CAAC,EAAE,KAAK,YAAY,cAAc,CAAC;AAC1E,kBAAc,OAAO,GAAG;AAAA,EAC5B;AAEA,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,UAAM,QAAQ,MAAM,gBAAgB,SAAS,IAAI,gBAAgB,IAAI,KAAK,aAAa;AAGvF,QAAI,IAAI,YAAY,UAAUA,QAAO,UAAU,KAAK,MAAM,YAAY,CAAC,GAAG;AACtE,eAAS,WAAY,GAAG,aAAa,KAAK;AAC1C;AAAA,IACJ;AAGA,UAAM,aAAa,MAAM,MAAM,MAAM,sBAAK,6CAAL,WAAqB,cAAc,KAAK,SAAS,GAClF,OAAO,WAAW,kBAAkB,WAA6B,KAAK,OAAO;AACjF,UAAM,eAAe,MAAM,MAAM,MAAM,KAAK,cAAc,qBAAqB,WAAW,IAAI,GAAG,KAAK,OAAO;AAG7G,iBAAa,aAAa,OAAO;AAGjC,QAAI,CAAC,aAAa,SAAS;AACvB,eAAS,OAAQ,IAAI,MAAM,4CAA4C,CAAC;AACxE;AAAA,IACJ;AAEA,aAAS,WAAY,GAAG,aAAa,IAAI;AACzC;AACA,uBAAmB,MAAM;AAAA,EAC7B;AAEA,WAAS,SAAU,mBAAmB,iBAAiB,SAAS;AACpE;AAEM,yBAAoB,eAAC,UAAe,SAAyC;AAC/E,QAAM,CAAC,QAAQ,kBAAkB,UAAU,IAA6C,MAAM,QAAQ,IAAI;AAAA,IACtG,cAAc,UAAU,SAAS,KAAK,OAAO;AAAA,IAC7C,MAAM,MAAM,KAAK,cAAc,gBAAgB,GAAG,KAAK,OAAO;AAAA,IAC9D,MAAM,MAAM,KAAK,cAAc,YAAY,GAAG,KAAK,OAAO;AAAA,EAC9D,CAAC;AACD,SAAO;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;AAEM,6BAAwB,eAAC,UAAe,SAAyC;AACnF,QAAM,CAAC,QAAQ,UAAU,IAAqC,MAAM,QAAQ,IAAI;AAAA,IAC5E,cAAc,UAAU,SAAS,KAAK,OAAO;AAAA,IAC7C,MAAM,MAAM,KAAK,cAAc,YAAY,GAAG,KAAK,OAAO;AAAA,EAC9D,CAAC;AACD,SAAO;AAAA,IACH,GAAG;AAAA,IACH;AAAA,EACJ;AACJ;AAEM,mBAAc,eAAC,UAAe,SAAyC;AACzE,SAAO,MAAM,cAAc,UAAU,SAAS,KAAK,OAAO;AAC9D;AAEM,kBAAa,eAAC,UAAe,KAAa,aAAqB,gBAA0C;AAC3G,MAAI,iBAAiB,aAAa;AAE9B,QAAI;AACA,YAAM,KAAK,MAAM,SAAS,SAAS,YAAY,GAAG,GAAG,WAAW;AAChE,4BAAK,kCAAL,WAAU,mCAAmC,GAAG,iBAAiB,WAAW,YAAY,GAAG,IAAI;AAC/F,YAAM,UAAU,MAAM,GAAG,KAAK;AAC9B,aAAO,SAAS,WAAW;AAAA,IAC/B,SAAS,GAAG;AACR,4BAAK,kCAAL,WAAU,8CAA8C,GAAG,MAAO,EAAU,WAAW,CAAC,IAAI;AAC5F,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAEM,gBAAW,eACb,cACA,KACA,SACA,SACA,mBACA,YACA,cACA,MACA,WACA,kBACA,UACmC;AAEnC,QAAM,QAAQ,OAAO,OAAO,QAAQ,MAAM;AAC1C,QAAM,KAAgC,MAAM,aAAa,oBAAoB,EAAE,oBAAoB,SAAS,YAAY,cAAc;AAAA,IAClI;AAAA,EACJ,CAAC;AAED,MAAI,YAAY,GAAG;AAEf,UAAM,UAAU,MAAM,KAAK,cAAc,YAAY;AACrD,OAAG,eAAe,QAAQ,eAAgB,OAAO,MAAM,SAAS,IAAI,OAAO,GAAG;AAC9E,OAAG,uBAAuB,QAAQ,uBAAwB,OAAO,MAAM,SAAS,IAAI,OAAO,GAAG;AAE9F,UAAM,UAAU,MAAM,KAAK,cAAc,gBAAgB;AACzD,OAAG,mBAAmB,UAAU,OAAO,MAAM,SAAS,IAAI,OAAO,GAAG;AAAA,EACxE;AAGA,QAAM,aAAa,MAAM,KAAK,cAAc,WAAW,IAAI,kBAAkB,SAAS,iBAAiB;AACvG,wBAAK,2CAAL,WAAmB,KAAK,YAAY,WAAW,MAAM;AACrD,SAAO;AACX;AAEM,oBAAe,eACjB,cACA,KACA,SACA,SACA,OACA,WACA,kBACA,UACmC;AACnC,QAAM,UAAUA,QAAO,QAAQ,KAAK;AACpC,QAAM,OAAO,MAAM,SAAS,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,EAAE,CAAC,IAAI;AACrG,QAAM,KAAK,MAAM,aAAa,sBAAsB,EAAE,oBAAoB,SAAS,SAAS,SAAS;AAAA,IACjG,OAAOA,QAAO,WAAW,KAAK,SAAS,CAAC;AAAA,EAC5C,CAAC;AAED,MAAI,YAAY,GAAG;AAEf,UAAM,UAAU,MAAM,KAAK,cAAc,YAAY;AACrD,OAAG,eAAe,QAAQ,eAAgB,OAAO,MAAM,SAAS,IAAI,OAAO,GAAG;AAC9E,OAAG,uBAAuB,QAAQ,uBAAwB,OAAO,MAAM,SAAS,IAAI,OAAO,GAAG;AAAA,EAClG;AAGA,QAAM,aAAa,MAAM,KAAK,cAAc,WAAW,IAAI,gBAAgB;AAC3E,wBAAK,2CAAL,WAAmB,KAAK,SAAS,WAAW,MAAM;AAClD,SAAO;AACX;AAEA,mBAAc,SAAC,SAA8B;AACzC,MAAI,aAAa;AACjB,MAAI,OAAO,OAAO,GAAG;AACjB,iBAAa,KAAK,KAAK,QAAQ,OAAO,iBAAiB;AAAA,EAC3D,WAAW,SAAS,OAAO,GAAG;AAC1B,iBAAa,KAAK,KAAK,QAAQ,SAAS,iBAAiB;AAAA,EAC7D;AACA,SAAO;AACX;AAEM,iBAAY,eAAC,SAAsB,OAAiG;AACtI,QAAM,OAAO,MAAM,gBAAgB,SAAS,QAAQ,oBAAoB,QAAQ,kBAAkB,iBAAiB;AACnH,QAAM,UAAU,cAAc,IAAI;AAElC,QAAM,aAAuB,CAAC;AAC9B,QAAM,eAAyB,CAAC;AAChC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,eAAW,KAAK,QAAQ,CAAC;AACzB,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC1B,mBAAa,KAAK,KAAK,SAAS,oBAAoB,CAAC;AAAA,IACzD,OAAO;AACH,mBAAa,KAAK,iBAAiB;AAAA,IACvC;AAAA,EACJ;AACA,SAAO,EAAE,SAAS,YAAY,aAAa;AAC/C;AAEA,oBAAe,SAAC,SAAsE;AAClF,QAAM,eAAe,KAAK,OAAO;AACjC,QAAM,eAAe,CAAC,UAAkB;AAAA,IACpC,eAAe,OAAO,eAAe,eAAe;AAAA,IACpD,aAAa,OAAO,eAAe,KAAK,KAAK,OAAO,YAAY,IAAI;AAAA,EACxE;AAEA,MAAI,OAAO,OAAO,GAAG;AACjB,WAAO,aAAa,QAAQ,IAAI;AAAA,EACpC,WAAW,SAAS,OAAO,GAAG;AAC1B,WAAO,aAAa,QAAQ,MAAM;AAAA,EACtC;AACA,SAAO,EAAE,eAAe,IAAI,aAAa,EAAE;AAC/C;AAEA,kBAAa,SAAC,KAAa,UAA6B,MAAc,UAA0B;AAC5F,QAAM,MAAM,MAAM,QAAQ,QAAQ,IAAI,SAAS,KAAK,GAAG,IAAI;AAC3D,QAAM,iBAAiB,qBAAqB,IAAI,iBAAiB,GAAG;AACpE,QAAM,cAAc,GAAG,cAAc,UAAU,GAAG;AAClD,wBAAK,kCAAL,WAAU;AAEV,MAAI,UAAU,mBAAmB;AAC7B,aAAS,kBAAkB,MAAM,QAAQ;AAAA,EAC7C;AACJ;AAEA,SAAI,SAAC,SAAiB,UAAmB,OAAO;AAC5C,MAAI,CAAC,KAAK,WAAY;AACtB,QAAM,SAAS;AACf,MAAI,SAAS;AACT,YAAQ,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,EACvC,OAAO;AACH,YAAQ,IAAI,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,EACrC;AACJ;AAptBG,IAAM,gBAAN;","names":["DecodeType","UploadType","ethers","ethers","ethers","ethers","ethers","provider","ethers"]}